Changeset 7421 for branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM
- Timestamp:
- 2016-12-01T18:10:41+01:00 (8 years ago)
- Location:
- branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM
- Files:
-
- 3 deleted
- 15 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/daymod.F90
r6140 r7421 2 2 !!====================================================================== 3 3 !! *** MODULE daymod *** 4 !! Ocean :calendar4 !! Ocean : management of the model calendar 5 5 !!===================================================================== 6 6 !! History : OPA ! 1994-09 (M. Pontaud M. Imbard) Original code … … 16 16 !!---------------------------------------------------------------------- 17 17 !! day : calendar 18 !! 19 !! ------------------------------- 20 !! ----------- WARNING ----------- 21 !! 22 !! we suppose that the time step is deviding the number of second of in a day 23 !! ---> MOD( rday, rdt ) == 0 24 !! 25 !! ----------- WARNING ----------- 26 !! ------------------------------- 27 !! 18 !!---------------------------------------------------------------------- 19 !! ----------- WARNING ----------- 20 !! ------------------------------- 21 !! sbcmod assume that the time step is dividing the number of second of 22 !! in a day, i.e. ===> MOD( rday, rdt ) == 0 23 !! except when user defined forcing is used (see sbcmod.F90) 28 24 !!---------------------------------------------------------------------- 29 25 USE dom_oce ! ocean space and time domain 30 26 USE phycst ! physical constants 27 USE ioipsl , ONLY : ymds2ju ! for calendar 28 USE trc_oce , ONLY : lk_offline ! offline flag 29 ! 31 30 USE in_out_manager ! I/O manager 31 USE prtctl ! Print control 32 32 USE iom ! 33 USE ioipsl , ONLY : ymds2ju ! for calendar34 USE prtctl ! Print control35 USE trc_oce , ONLY : lk_offline ! offline flag36 33 USE timing ! Timing 37 34 USE restart ! restart … … 47 44 48 45 !!---------------------------------------------------------------------- 49 !! NEMO/OPA 3.3 , NEMO Consortium (2010)46 !! NEMO/OPA 4.0 , NEMO Consortium (2016) 50 47 !! $Id$ 51 48 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 70 67 !! - nmonth_len, nyear_len, nmonth_half, nmonth_end through day_mth 71 68 !!---------------------------------------------------------------------- 72 INTEGER :: inbday, idweek 73 REAL(wp) :: zjul 69 INTEGER :: inbday, idweek ! local integers 70 REAL(wp) :: zjul ! local scalar 74 71 !!---------------------------------------------------------------------- 75 72 ! … … 79 76 & 'You must do a restart at higher frequency (or remove this stop and recompile the code in I8)' ) 80 77 ENDIF 81 ! all calendar staff is based on the fact that MOD( rday, rdt ) == 0 82 IF( MOD( rday , rdt ) /= 0. ) CALL ctl_stop( 'the time step must devide the number of second of in a day' ) 83 IF( MOD( rday , 2. ) /= 0. ) CALL ctl_stop( 'the number of second of in a day must be an even number' ) 84 IF( MOD( rdt , 2. ) /= 0. ) CALL ctl_stop( 'the time step (in second) must be an even number' ) 85 nsecd = NINT(rday ) 86 nsecd05 = NINT(0.5 * rday ) 87 ndt = NINT( rdt ) 88 ndt05 = NINT(0.5 * rdt ) 89 90 IF( .NOT. lk_offline ) CALL day_rst( nit000, 'READ' ) 78 nsecd = NINT( rday ) 79 nsecd05 = NINT( 0.5 * rday ) 80 ndt = NINT( rdt ) 81 ndt05 = NINT( 0.5 * rdt ) 82 83 IF( .NOT. lk_offline ) CALL day_rst( nit000, 'READ' ) 91 84 92 85 ! set the calandar from ndastp (read in restart file and namelist) 93 94 86 nyear = ndastp / 10000 95 87 nmonth = ( ndastp - (nyear * 10000) ) / 100 -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90
r7412 r7421 29 29 !! time & space domain namelist 30 30 !! ---------------------------- 31 ! !!* Namelist namdom : time & space domain * 32 INTEGER , PUBLIC :: nn_bathy !: = 0/1 ,compute/read the bathymetry file 33 REAL(wp), PUBLIC :: rn_bathy !: depth of flat bottom (active if nn_bathy=0; if =0 depth=jpkm1) 34 REAL(wp), PUBLIC :: rn_hmin !: minimum ocean depth (>0) or minimum number of ocean levels (<0) 35 REAL(wp), PUBLIC :: rn_isfhmin !: threshold to discriminate grounded ice to floating ice 36 REAL(wp), PUBLIC :: rn_e3zps_min !: miminum thickness for partial steps (meters) 37 REAL(wp), PUBLIC :: rn_e3zps_rat !: minimum thickness ration for partial steps 38 INTEGER , PUBLIC :: nn_msh !: = 1 create a mesh-mask file 39 REAL(wp), PUBLIC :: rn_atfp !: asselin time filter parameter 40 REAL(wp), PUBLIC :: rn_rdt !: time step for the dynamics and tracer 41 INTEGER , PUBLIC :: nn_closea !: =0 suppress closed sea/lake from the ORCA domain or not (=1) 42 INTEGER , PUBLIC :: nn_euler !: =0 start with forward time step or not (=1) 31 ! !!* Namelist namdom : time & space domain * 32 LOGICAL , PUBLIC :: ln_linssh !: =T linear free surface ==>> model level are fixed in time 33 INTEGER , PUBLIC :: nn_closea !: =0 suppress closed sea/lake from the ORCA domain or not (=1) 34 INTEGER , PUBLIC :: nn_msh !: >0 create a mesh-mask file (mesh_mask.nc) 35 REAL(wp), PUBLIC :: rn_isfhmin !: threshold to discriminate grounded ice to floating ice 36 REAL(wp), PUBLIC :: rn_rdt !: time step for the dynamics and tracer 37 REAL(wp), PUBLIC :: rn_atfp !: asselin time filter parameter 38 INTEGER , PUBLIC :: nn_euler !: =0 start with forward time step or not (=1) 43 39 LOGICAL , PUBLIC :: ln_iscpl !: coupling with ice sheet 44 LOGICAL , PUBLIC :: ln_crs 40 LOGICAL , PUBLIC :: ln_crs !: Apply grid coarsening to dynamical model output or online passive tracers 45 41 46 42 !! Free surface parameters 47 43 !! ======================= 48 LOGICAL , PUBLIC :: ln_dynspg_exp 49 LOGICAL , PUBLIC :: ln_dynspg_ts 44 LOGICAL , PUBLIC :: ln_dynspg_exp !: Explicit free surface flag 45 LOGICAL , PUBLIC :: ln_dynspg_ts !: Split-Explicit free surface flag 50 46 51 47 !! Time splitting parameters 52 48 !! ========================= 53 LOGICAL, PUBLIC :: ln_bt_fw !: Forward integration of barotropic sub-stepping 54 LOGICAL, PUBLIC :: ln_bt_av !: Time averaging of barotropic variables 55 LOGICAL, PUBLIC :: ln_bt_auto !: Set number of barotropic iterations automatically 56 INTEGER, PUBLIC :: nn_bt_flt !: Filter choice 57 INTEGER, PUBLIC :: nn_baro !: Number of barotropic iterations during one baroclinic step (rdt) 58 REAL(wp), PUBLIC :: rn_bt_cmax !: Maximum allowed courant number (used if ln_bt_auto=T) 59 60 !! Horizontal grid parameters for domhgr 61 !! ===================================== 62 INTEGER :: jphgr_msh !: type of horizontal mesh 63 ! ! = 0 curvilinear coordinate on the sphere read in coordinate.nc 64 ! ! = 1 geographical mesh on the sphere with regular grid-spacing 65 ! ! = 2 f-plane with regular grid-spacing 66 ! ! = 3 beta-plane with regular grid-spacing 67 ! ! = 4 Mercator grid with T/U point at the equator 68 69 REAL(wp) :: ppglam0 !: longitude of first raw and column T-point (jphgr_msh = 1) 70 REAL(wp) :: ppgphi0 !: latitude of first raw and column T-point (jphgr_msh = 1) 71 ! ! used for Coriolis & Beta parameters (jphgr_msh = 2 or 3) 72 REAL(wp) :: ppe1_deg !: zonal grid-spacing (degrees) 73 REAL(wp) :: ppe2_deg !: meridional grid-spacing (degrees) 74 REAL(wp) :: ppe1_m !: zonal grid-spacing (degrees) 75 REAL(wp) :: ppe2_m !: meridional grid-spacing (degrees) 76 77 !! Vertical grid parameter for domzgr 78 !! ================================== 79 REAL(wp) :: ppsur !: ORCA r4, r2 and r05 coefficients 80 REAL(wp) :: ppa0 !: (default coefficients) 81 REAL(wp) :: ppa1 !: 82 REAL(wp) :: ppkth !: 83 REAL(wp) :: ppacr !: 84 ! 85 ! If both ppa0 ppa1 and ppsur are specified to 0, then 86 ! they are computed from ppdzmin, pphmax , ppkth, ppacr in dom_zgr 87 REAL(wp) :: ppdzmin !: Minimum vertical spacing 88 REAL(wp) :: pphmax !: Maximum depth 89 ! 90 LOGICAL :: ldbletanh !: Use/do not use double tanf function for vertical coordinates 91 REAL(wp) :: ppa2 !: Double tanh function parameters 92 REAL(wp) :: ppkth2 !: 93 REAL(wp) :: ppacr2 !: 94 95 ! !! old non-DOCTOR names still used in the model 96 INTEGER , PUBLIC :: ntopo !: = 0/1 ,compute/read the bathymetry file 97 REAL(wp), PUBLIC :: e3zps_min !: miminum thickness for partial steps (meters) 98 REAL(wp), PUBLIC :: e3zps_rat !: minimum thickness ration for partial steps 99 INTEGER , PUBLIC :: nmsh !: = 1 create a mesh-mask file 100 REAL(wp), PUBLIC :: atfp !: asselin time filter parameter 101 REAL(wp), PUBLIC :: rdt !: time step for the dynamics and tracer 102 103 ! !!! associated variables 104 INTEGER , PUBLIC :: neuler !: restart euler forward option (0=Euler) 105 REAL(wp), PUBLIC :: atfp1 !: asselin time filter coeff. (atfp1= 1-2*atfp) 106 REAL(wp), PUBLIC :: r2dt !: = 2*rdt except at nit000 (=rdt) if neuler=0 49 LOGICAL, PUBLIC :: ln_bt_fw !: Forward integration of barotropic sub-stepping 50 LOGICAL, PUBLIC :: ln_bt_av !: Time averaging of barotropic variables 51 LOGICAL, PUBLIC :: ln_bt_auto !: Set number of barotropic iterations automatically 52 INTEGER, PUBLIC :: nn_bt_flt !: Filter choice 53 INTEGER, PUBLIC :: nn_baro !: Number of barotropic iterations during one baroclinic step (rdt) 54 REAL(wp), PUBLIC :: rn_bt_cmax !: Maximum allowed courant number (used if ln_bt_auto=T) 55 56 57 ! !! old non-DOCTOR names still used in the model 58 REAL(wp), PUBLIC :: atfp !: asselin time filter parameter 59 REAL(wp), PUBLIC :: rdt !: time step for the dynamics and tracer 60 61 ! !!! associated variables 62 INTEGER , PUBLIC :: neuler !: restart euler forward option (0=Euler) 63 REAL(wp), PUBLIC :: r2dt !: = 2*rdt except at nit000 (=rdt) if neuler=0 107 64 108 65 !!---------------------------------------------------------------------- 109 66 !! space domain parameters 110 67 !!---------------------------------------------------------------------- 111 LOGICAL, PUBLIC :: lzoom = .FALSE. !: zoom flag 112 LOGICAL, PUBLIC :: lzoom_e = .FALSE. !: East zoom type flag 113 LOGICAL, PUBLIC :: lzoom_w = .FALSE. !: West zoom type flag 114 LOGICAL, PUBLIC :: lzoom_s = .FALSE. !: South zoom type flag 115 LOGICAL, PUBLIC :: lzoom_n = .FALSE. !: North zoom type flag 116 117 ! !!! domain parameters linked to mpp 118 INTEGER, PUBLIC :: nperio !: type of lateral boundary condition 119 INTEGER, PUBLIC :: nimpp, njmpp !: i- & j-indexes for mpp-subdomain left bottom 120 INTEGER, PUBLIC :: nreci, nrecj !: overlap region in i and j 121 INTEGER, PUBLIC :: nproc !: number for local processor 122 INTEGER, PUBLIC :: narea !: number for local area 123 INTEGER, PUBLIC :: nbondi, nbondj !: mark of i- and j-direction local boundaries 68 INTEGER, PUBLIC :: jperio !: Global domain lateral boundary type (between 0 and 6) 69 ! ! = 0 closed ; = 1 cyclic East-West 70 ! ! = 2 equatorial symmetric ; = 3 North fold T-point pivot 71 ! ! = 4 cyclic East-West AND North fold T-point pivot 72 ! ! = 5 North fold F-point pivot 73 ! ! = 6 cyclic East-West AND North fold F-point pivot 74 INTEGER, PUBLIC :: nperio !: Local domain lateral boundary type (deduced from jperio and MPP decomposition) 75 76 ! ! domain MPP decomposition parameters 77 INTEGER , PUBLIC :: nimpp, njmpp !: i- & j-indexes for mpp-subdomain left bottom 78 INTEGER , PUBLIC :: nreci, nrecj !: overlap region in i and j 79 INTEGER , PUBLIC :: nproc !: number for local processor 80 INTEGER , PUBLIC :: narea !: number for local area 81 INTEGER , PUBLIC :: nbondi, nbondj !: mark of i- and j-direction local boundaries 124 82 INTEGER, ALLOCATABLE, PUBLIC :: nbondi_bdy(:) !: mark i-direction local boundaries for BDY open boundaries 125 83 INTEGER, ALLOCATABLE, PUBLIC :: nbondj_bdy(:) !: mark j-direction local boundaries for BDY open boundaries … … 140 98 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: mig !: local ==> global domain i-index 141 99 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: mjg !: local ==> global domain j-index 142 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: mi0, mi1 !: global ==> local domain i-index !!bug ==> other solution?143 ! ! (mi0=1 and mi1=0 if the global indexis not in the local domain)144 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: mj0, mj1 !: global ==> local domain j-index !!bug ==> other solution?145 ! ! (mi0=1 and mi1=0 if the global indexis not in the local domain)100 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: mi0, mi1 !: global ==> local domain i-index (mi0=1 and mi1=0 if the global index 101 ! ! is not in the local domain) 102 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: mj0, mj1 !: global ==> local domain j-index (mj0=1 and mj1=0 if the global index 103 ! ! is not in the local domain) 146 104 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: nimppt, njmppt !: i-, j-indexes for each processor 147 105 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ibonit, ibonjt !: i-, j- processor neighbour existence … … 154 112 !! horizontal curvilinear coordinate and scale factors 155 113 !! --------------------------------------------------------------------- 156 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: glamt , glamu, glamv , glamf !: longitude at t, u, v, f-points [degree]157 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: gphit , gphiu, gphiv , gphif !: latitude at t, u, v, f-points [degree]114 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: glamt , glamu, glamv , glamf !: longitude at t, u, v, f-points [degree] 115 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: gphit , gphiu, gphiv , gphif !: latitude at t, u, v, f-points [degree] 158 116 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) :: e1t , e2t , r1_e1t, r1_e2t !: t-point horizontal scale factors [m] 159 117 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) :: e1u , e2u , r1_e1u, r1_e2u !: horizontal scale factors at u-point [m] … … 161 119 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) :: e1f , e2f , r1_e1f, r1_e2f !: horizontal scale factors at f-point [m] 162 120 ! 163 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: e1e2t , r1_e1e2t !: associated metrics at t-point164 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: e1e2u , r1_e1e2u , e2_e1u !: associated metrics at u-point165 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: e1e2v , r1_e1e2v , e1_e2v !: associated metrics at v-point166 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: e1e2f , r1_e1e2f !: associated metrics at f-point121 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: e1e2t , r1_e1e2t !: associated metrics at t-point 122 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: e1e2u , r1_e1e2u , e2_e1u !: associated metrics at u-point 123 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: e1e2v , r1_e1e2v , e1_e2v !: associated metrics at v-point 124 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: e1e2f , r1_e1e2f !: associated metrics at f-point 167 125 ! 168 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ff !: coriolis factor [1/s] 169 126 REAL(wp), PUBLIC, ALLOCATABLE, SAVE , DIMENSION(:,:) :: ff_f, ff_t !: coriolis factor at f- and t-point [1/s] 170 127 !!---------------------------------------------------------------------- 171 128 !! vertical coordinate and scale factors 172 129 !! --------------------------------------------------------------------- 173 ! !!* Namelist namzgr : vertical coordinate *174 130 LOGICAL, PUBLIC :: ln_zco !: z-coordinate - full step 175 131 LOGICAL, PUBLIC :: ln_zps !: z-coordinate - partial step 176 132 LOGICAL, PUBLIC :: ln_sco !: s-coordinate or hybrid z-s coordinate 177 133 LOGICAL, PUBLIC :: ln_isfcav !: presence of ISF 178 LOGICAL, PUBLIC :: ln_linssh !: variable grid flag179 180 134 ! ! ref. ! before ! now ! after ! 181 135 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3t_0 , e3t_b , e3t_n , e3t_a !: t- vert. scale factor [m] … … 207 161 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: gdept_1d, gdepw_1d !: reference depth of t- and w-points (m) 208 162 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: e3t_1d , e3w_1d !: reference vertical scale factors at T- and W-pts (m) 209 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: e3tp , e3wp !: ocean bottom level thickness at T and W points 210 211 !!gm This should be removed from here.... ==>>> only used in domzgr at initialization phase 212 !! s-coordinate and hybrid z-s-coordinate 213 !! =----------------======--------------- 214 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: gsigt, gsigw !: model level depth coefficient at t-, w-levels (analytic) 215 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: gsi3w !: model level depth coefficient at w-level (sum of gsigw) 216 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: esigt, esigw !: vertical scale factor coef. at t-, w-levels 217 218 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hbatv , hbatf !: ocean depth at the vertical of v--f 219 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hbatt , hbatu !: t--u points (m) 220 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: scosrf, scobot !: ocean surface and bottom topographies 221 ! ! (if deviating from coordinate surfaces in HYBRID) 222 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hifv , hiff !: interface depth between stretching at v--f 223 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hift , hifu !: and quasi-uniform spacing t--u points (m) 224 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rx1 !: Maximum grid stiffness ratio 225 !!gm end 226 227 !!---------------------------------------------------------------------- 228 !! masks, bathymetry 163 164 165 !!---------------------------------------------------------------------- 166 !! masks, top and bottom ocean point position 229 167 !! --------------------------------------------------------------------- 230 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mbathy !: number of ocean level (=0, 1, ... , jpk-1) 231 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mbkt !: vertical index of the bottom last T- ocean level 232 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mbku, mbkv !: vertical index of the bottom last U- and W- ocean level 233 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: bathy !: ocean depth (meters) 168 !!gm Proposition of new name for top/bottom vertical indices 169 ! INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mtk_t, mtk_u, mtk_v !: top first wet T-, U-, V-, F-level (ISF) 170 ! INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mbk_t, mbk_u, mbk_v !: bottom last wet T-, U- and V-level 171 !!gm 172 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mbkt, mbku, mbkv !: bottom last wet T-, U- and V-level 234 173 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tmask_i !: interior domain T-point mask 235 174 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tmask_h !: internal domain T-point mask (Figure 8.5 NEMO book) 236 175 237 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfdep !: top first ocean level 238 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mikt, miku, mikv, mikf !: first wet T-, U-, V-, F- oceanlevel (ISF)239 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfdep !: Iceshelf draft 240 241 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ssmask, ssumask, ssvmask , ssfmask!: surface mask at T-,U-, V- and F-pts176 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: misfdep !: top first ocean level (ISF) 177 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mikt, miku, mikv, mikf !: top first wet T-, U-, V-, F-level (ISF) 178 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: risfdep !: Iceshelf draft (ISF) 179 180 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ssmask, ssumask, ssvmask !: surface mask at T-,U-, V- and F-pts 242 181 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: tmask, umask, vmask, fmask !: land/ocean mask at T-, U-, V- and F-pts 243 182 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: wmask, wumask, wvmask !: land/ocean mask at WT-, WU- and WV-pts … … 280 219 !!---------------------------------------------------------------------- 281 220 !! NEMO/OPA 4.0 , NEMO Consortium (2011) 282 !! $Id$ 221 !! $Id$ 283 222 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 284 223 !!---------------------------------------------------------------------- … … 300 239 INTEGER FUNCTION dom_oce_alloc() 301 240 !!---------------------------------------------------------------------- 302 INTEGER, DIMENSION(1 3) :: ierr241 INTEGER, DIMENSION(12) :: ierr 303 242 !!---------------------------------------------------------------------- 304 243 ierr(:) = 0 … … 310 249 & njmppt(jpnij) , ibonjt(jpnij) , nldit(jpnij) , nldjt(jpnij) , & 311 250 & nleit(jpnij) , nlejt(jpnij) , & 312 & mi0(jpi dta) , mi1 (jpidta), mj0(jpjdta) , mj1 (jpjdta),&313 & tpol(jpiglo) , fpol(jpiglo) , STAT=ierr(2) )251 & mi0(jpiglo) , mi1 (jpiglo), mj0(jpjglo) , mj1 (jpjglo) , & 252 & tpol(jpiglo) , fpol(jpiglo) , STAT=ierr(2) ) 314 253 ! 315 254 ALLOCATE( glamt(jpi,jpj) , glamu(jpi,jpj) , glamv(jpi,jpj) , glamf(jpi,jpj) , & … … 323 262 & e1e2v(jpi,jpj) , r1_e1e2v(jpi,jpj) , e1_e2v(jpi,jpj) , & 324 263 & e1e2f(jpi,jpj) , r1_e1e2f(jpi,jpj) , & 325 & ff (jpi,jpj), STAT=ierr(3) )326 ! 327 ALLOCATE( gdept_0(jpi,jpj,jpk) , gdepw_0(jpi,jpj,jpk) , gde3w_0(jpi,jpj,jpk) , &264 & ff_f (jpi,jpj) , ff_t (jpi,jpj) , STAT=ierr(3) ) 265 ! 266 ALLOCATE( gdept_0(jpi,jpj,jpk) , gdepw_0(jpi,jpj,jpk) , gde3w_0(jpi,jpj,jpk) , & 328 267 & gdept_b(jpi,jpj,jpk) , gdepw_b(jpi,jpj,jpk) , & 329 268 & gdept_n(jpi,jpj,jpk) , gdepw_n(jpi,jpj,jpk) , gde3w_n(jpi,jpj,jpk) , STAT=ierr(4) ) … … 344 283 ! 345 284 ! 346 ALLOCATE( gdept_1d(jpk) , gdepw_1d(jpk) , & 347 & e3t_1d (jpk) , e3w_1d (jpk) , e3tp (jpi,jpj), e3wp(jpi,jpj) , & 348 & gsigt (jpk) , gsigw (jpk) , gsi3w(jpk) , & 349 & esigt (jpk) , esigw (jpk) , STAT=ierr(7) ) 350 ! 351 ALLOCATE( hbatv (jpi,jpj) , hbatf (jpi,jpj) , & 352 & hbatt (jpi,jpj) , hbatu (jpi,jpj) , & 353 & scosrf(jpi,jpj) , scobot(jpi,jpj) , & 354 & hifv (jpi,jpj) , hiff (jpi,jpj) , & 355 & hift (jpi,jpj) , hifu (jpi,jpj) , rx1(jpi,jpj) , STAT=ierr(8) ) 356 357 ALLOCATE( mbathy(jpi,jpj) , bathy (jpi,jpj) , & 358 & tmask_i(jpi,jpj) , tmask_h(jpi,jpj) , & 359 & ssmask (jpi,jpj) , ssumask(jpi,jpj) , ssvmask(jpi,jpj) , ssfmask(jpi,jpj) , & 360 & mbkt (jpi,jpj) , mbku (jpi,jpj) , mbkv (jpi,jpj) , STAT=ierr(9) ) 361 362 ! (ISF) Allocation of basic array 363 ALLOCATE( misfdep(jpi,jpj) , risfdep(jpi,jpj), & 364 & mikt(jpi,jpj), miku(jpi,jpj), mikv(jpi,jpj) , & 365 & mikf(jpi,jpj), STAT=ierr(10) ) 366 367 ALLOCATE( tmask(jpi,jpj,jpk) , umask(jpi,jpj,jpk), & 368 & vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk), STAT=ierr(11) ) 369 285 ALLOCATE( gdept_1d(jpk) , gdepw_1d(jpk) , e3t_1d(jpk) , e3w_1d(jpk) , STAT=ierr(7) ) 286 ! 287 ALLOCATE( tmask_i(jpi,jpj) , tmask_h(jpi,jpj) , & 288 & ssmask (jpi,jpj) , ssumask(jpi,jpj) , ssvmask(jpi,jpj) , & 289 & mbkt (jpi,jpj) , mbku (jpi,jpj) , mbkv (jpi,jpj) , STAT=ierr(9) ) 290 ! 291 ALLOCATE( misfdep(jpi,jpj) , mikt(jpi,jpj) , miku(jpi,jpj) , & 292 & risfdep(jpi,jpj) , mikv(jpi,jpj) , mikf(jpi,jpj) , STAT=ierr(10) ) 293 ! 294 ALLOCATE( tmask(jpi,jpj,jpk) , umask(jpi,jpj,jpk) , & 295 & vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk) , STAT=ierr(11) ) 296 ! 370 297 ALLOCATE( wmask(jpi,jpj,jpk) , wumask(jpi,jpj,jpk), wvmask(jpi,jpj,jpk) , STAT=ierr(12) ) 371 298 ! -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/domain.F90
r6981 r7421 14 14 !! 3.6 ! 2013 ( J. Simeon, C. Calone, G. Madec, C. Ethe ) Online coarsening of outputs 15 15 !! 3.7 ! 2015-11 (G. Madec, A. Coward) time varying zgr by default 16 !! 4.0 ! 2016-10 (G. Madec, S. Flavoni) domain configuration / user defined interface 16 17 !!---------------------------------------------------------------------- 17 18 18 19 !!---------------------------------------------------------------------- 19 !! dom_init : initialize the space and time domain 20 !! dom_nam : read and contral domain namelists 21 !! dom_ctl : control print for the ocean domain 22 !! dom_stiff : diagnose maximum grid stiffness/hydrostatic consistency (s-coordinate) 20 !! dom_init : initialize the space and time domain 21 !! dom_glo : initialize global domain <--> local domain indices 22 !! dom_nam : read and contral domain namelists 23 !! dom_ctl : control print for the ocean domain 24 !! domain_cfg : read the global domain size in domain configuration file 25 !! cfg_write : create the domain configuration file 23 26 !!---------------------------------------------------------------------- 24 USE oce ! ocean variables 25 USE dom_oce ! domain: ocean 26 USE sbc_oce ! surface boundary condition: ocean 27 USE phycst ! physical constants 28 USE closea ! closed seas 29 USE domhgr ! domain: set the horizontal mesh 30 USE domzgr ! domain: set the vertical mesh 31 USE domstp ! domain: set the time-step 32 USE dommsk ! domain: set the mask system 33 USE domwri ! domain: write the meshmask file 34 USE domvvl ! variable volume 35 USE c1d ! 1D vertical configuration 36 USE dyncor_c1d ! Coriolis term (c1d case) (cor_c1d routine) 27 USE oce ! ocean variables 28 USE dom_oce ! domain: ocean 29 USE sbc_oce ! surface boundary condition: ocean 30 USE trc_oce ! shared ocean & passive tracers variab 31 USE phycst ! physical constants 32 USE usrdef_closea ! closed seas 33 USE domhgr ! domain: set the horizontal mesh 34 USE domzgr ! domain: set the vertical mesh 35 USE dommsk ! domain: set the mask system 36 USE domwri ! domain: write the meshmask file 37 USE domvvl ! variable volume 38 USE c1d ! 1D configuration 39 USE domc1d ! 1D configuration: column location 40 USE dyncor_c1d ! 1D configuration: Coriolis term (cor_c1d routine) 37 41 ! 38 USE in_out_manager ! I/O manager 39 USE wrk_nemo ! Memory Allocation 40 USE lib_mpp ! distributed memory computing library 41 USE lbclnk ! ocean lateral boundary condition (or mpp link) 42 USE timing ! Timing 42 USE in_out_manager ! I/O manager 43 USE iom ! I/O library 44 USE lbclnk ! ocean lateral boundary condition (or mpp link) 45 USE lib_mpp ! distributed memory computing library 46 USE wrk_nemo ! Memory Allocation 47 USE timing ! Timing 43 48 44 49 IMPLICIT NONE 45 50 PRIVATE 46 51 47 PUBLIC dom_init ! called by opa.F90 52 PUBLIC dom_init ! called by nemogcm.F90 53 PUBLIC domain_cfg ! called by nemogcm.F90 48 54 49 55 !!------------------------------------------------------------------------- … … 66 72 !! and scale factors, and the coriolis factor 67 73 !! - dom_zgr: define the vertical coordinate and the bathymetry 68 !! - dom_stp: defined the model time step 69 !! - dom_wri: create the meshmask file if nmsh=1 74 !! - dom_wri: create the meshmask file if nn_msh=1 70 75 !! - 1D configuration, move Coriolis, u and v at T-point 71 76 !!---------------------------------------------------------------------- 72 INTEGER :: jk ! dummy loop indices 73 INTEGER :: iconf = 0 ! local integers 74 REAL(wp), POINTER, DIMENSION(:,:) :: z1_hu_0, z1_hv_0 77 INTEGER :: ji, jj, jk, ik ! dummy loop indices 78 INTEGER :: iconf = 0 ! local integers 79 CHARACTER (len=64) :: cform = "(A12, 3(A13, I7))" 80 INTEGER , DIMENSION(jpi,jpj) :: ik_top , ik_bot ! top and bottom ocean level 81 REAL(wp), DIMENSION(jpi,jpj) :: z1_hu_0, z1_hv_0 75 82 !!---------------------------------------------------------------------- 76 83 ! 77 84 IF( nn_timing == 1 ) CALL timing_start('dom_init') 78 85 ! 79 IF(lwp) THEN 86 IF(lwp) THEN ! Ocean domain Parameters (control print) 80 87 WRITE(numout,*) 81 88 WRITE(numout,*) 'dom_init : domain initialization' 82 89 WRITE(numout,*) '~~~~~~~~' 83 ENDIF 84 ! 85 ! !== Reference coordinate system ==! 86 ! 87 CALL dom_nam ! read namelist ( namrun, namdom ) 88 CALL dom_clo ! Closed seas and lake 89 CALL dom_hgr ! Horizontal mesh 90 CALL dom_zgr ! Vertical mesh and bathymetry 91 CALL dom_msk ! Masks 92 IF( ln_sco ) CALL dom_stiff ! Maximum stiffness ratio/hydrostatic consistency 93 ! 94 ht_0(:,:) = e3t_0(:,:,1) * tmask(:,:,1) ! Reference ocean thickness 95 hu_0(:,:) = e3u_0(:,:,1) * umask(:,:,1) 96 hv_0(:,:) = e3v_0(:,:,1) * vmask(:,:,1) 97 DO jk = 2, jpk 90 ! 91 WRITE(numout,*) ' Domain info' 92 WRITE(numout,*) ' dimension of model:' 93 WRITE(numout,*) ' Local domain Global domain Data domain ' 94 WRITE(numout,cform) ' ',' jpi : ', jpi, ' jpiglo : ', jpiglo 95 WRITE(numout,cform) ' ',' jpj : ', jpj, ' jpjglo : ', jpjglo 96 WRITE(numout,cform) ' ',' jpk : ', jpk, ' jpkglo : ', jpkglo 97 WRITE(numout,cform) ' ' ,' jpij : ', jpij 98 WRITE(numout,*) ' mpp local domain info (mpp):' 99 WRITE(numout,*) ' jpni : ', jpni, ' jpreci : ', jpreci 100 WRITE(numout,*) ' jpnj : ', jpnj, ' jprecj : ', jprecj 101 WRITE(numout,*) ' jpnij : ', jpnij 102 WRITE(numout,*) ' lateral boundary of the Global domain : jperio = ', jperio 103 SELECT CASE ( jperio ) 104 CASE( 0 ) ; WRITE(numout,*) ' (i.e. closed)' 105 CASE( 1 ) ; WRITE(numout,*) ' (i.e. cyclic east-west)' 106 CASE( 2 ) ; WRITE(numout,*) ' (i.e. equatorial symmetric)' 107 CASE( 3 ) ; WRITE(numout,*) ' (i.e. north fold with T-point pivot)' 108 CASE( 4 ) ; WRITE(numout,*) ' (i.e. cyclic east-west and north fold with T-point pivot)' 109 CASE( 5 ) ; WRITE(numout,*) ' (i.e. north fold with F-point pivot)' 110 CASE( 6 ) ; WRITE(numout,*) ' (i.e. cyclic east-west and north fold with F-point pivot)' 111 CASE DEFAULT 112 CALL ctl_stop( 'jperio is out of range' ) 113 END SELECT 114 WRITE(numout,*) ' Ocean model configuration used:' 115 WRITE(numout,*) ' cn_cfg = ', cn_cfg 116 WRITE(numout,*) ' nn_cfg = ', nn_cfg 117 ENDIF 118 ! 119 ! 120 !!gm This should be removed with the new configuration interface 121 IF( lk_c1d .AND. ln_c1d_locpt ) CALL dom_c1d( rn_lat1d, rn_lon1d ) 122 !!gm end 123 ! 124 ! !== Reference coordinate system ==! 125 ! 126 CALL dom_glo ! global domain versus local domain 127 CALL dom_nam ! read namelist ( namrun, namdom ) 128 CALL dom_clo( cn_cfg, nn_cfg ) ! Closed seas and lake 129 CALL dom_hgr ! Horizontal mesh 130 CALL dom_zgr( ik_top, ik_bot ) ! Vertical mesh and bathymetry 131 IF( nn_closea == 0 ) CALL clo_bat( ik_top, ik_bot ) !== remove closed seas or lakes ==! 132 CALL dom_msk( ik_top, ik_bot ) ! Masks 133 ! 134 DO jj = 1, jpj ! depth of the iceshelves 135 DO ji = 1, jpi 136 ik = mikt(ji,jj) 137 risfdep(ji,jj) = gdepw_0(ji,jj,ik) 138 END DO 139 END DO 140 ! 141 ht_0(:,:) = 0._wp ! Reference ocean thickness 142 hu_0(:,:) = 0._wp 143 hv_0(:,:) = 0._wp 144 DO jk = 1, jpk 98 145 ht_0(:,:) = ht_0(:,:) + e3t_0(:,:,jk) * tmask(:,:,jk) 99 146 hu_0(:,:) = hu_0(:,:) + e3u_0(:,:,jk) * umask(:,:,jk) … … 101 148 END DO 102 149 ! 103 ! !== time varying part of coordinate system ==! 104 ! 105 IF( ln_linssh ) THEN ! Fix in time : set to the reference one for all 150 ! !== time varying part of coordinate system ==! 151 ! 152 IF( ln_linssh ) THEN != Fix in time : set to the reference one for all 153 ! 106 154 ! before ! now ! after ! 107 155 gdept_b = gdept_0 ; gdept_n = gdept_0 ! --- ! depth of grid-points … … 117 165 e3vw_b = e3vw_0 ; e3vw_n = e3vw_0 ! --- ! 118 166 ! 119 CALL wrk_alloc( jpi,jpj, z1_hu_0, z1_hv_0 )120 !121 167 z1_hu_0(:,:) = ssumask(:,:) / ( hu_0(:,:) + 1._wp - ssumask(:,:) ) ! _i mask due to ISF 122 168 z1_hv_0(:,:) = ssvmask(:,:) / ( hv_0(:,:) + 1._wp - ssvmask(:,:) ) … … 129 175 r1_hv_b = z1_hv_0 ; r1_hv_n = z1_hv_0 ; r1_hv_a = z1_hv_0 ! 130 176 ! 131 CALL wrk_dealloc( jpi,jpj, z1_hu_0, z1_hv_0 ) 132 ! 133 ELSE ! time varying : initialize before/now/after variables 134 ! 135 CALL dom_vvl_init 177 ! 178 ELSE != time varying : initialize before/now/after variables 179 ! 180 IF( .NOT.lk_offline ) CALL dom_vvl_init 136 181 ! 137 182 ENDIF … … 139 184 IF( lk_c1d ) CALL cor_c1d ! 1D configuration: Coriolis set at T-point 140 185 ! 141 CALL dom_stp ! time step 142 IF( nmsh /= 0 .AND. .NOT. ln_iscpl ) CALL dom_wri ! Create a domain file 143 IF( nmsh /= 0 .AND. ln_iscpl .AND. .NOT. ln_rstart ) CALL dom_wri ! Create a domain file 186 IF( nn_msh > 0 .AND. .NOT. ln_iscpl ) CALL dom_wri ! Create a domain file 187 IF( nn_msh > 0 .AND. ln_iscpl .AND. .NOT. ln_rstart ) CALL dom_wri ! Create a domain file 144 188 IF( .NOT.ln_rstart ) CALL dom_ctl ! Domain control 145 189 ! 190 191 IF(lwp) THEN 192 WRITE(numout,*) 193 WRITE(numout,*) 'dom_init : end of domain initialization nn_msh=', nn_msh 194 WRITE(numout,*) 195 ENDIF 196 ! 197 IF( ln_write_cfg ) CALL cfg_write ! create the configuration file 198 ! 146 199 IF( nn_timing == 1 ) CALL timing_stop('dom_init') 147 200 ! 148 201 END SUBROUTINE dom_init 202 203 204 SUBROUTINE dom_glo 205 !!---------------------------------------------------------------------- 206 !! *** ROUTINE dom_glo *** 207 !! 208 !! ** Purpose : initialization of global domain <--> local domain indices 209 !! 210 !! ** Method : 211 !! 212 !! ** Action : - mig , mjg : local domain indices ==> global domain indices 213 !! - mi0 , mi1 : global domain indices ==> local domain indices 214 !! - mj0,, mj1 (global point not in the local domain ==> mi0>mi1 and/or mj0>mj1) 215 !!---------------------------------------------------------------------- 216 INTEGER :: ji, jj ! dummy loop argument 217 !!---------------------------------------------------------------------- 218 ! 219 DO ji = 1, jpi ! local domain indices ==> global domain indices 220 mig(ji) = ji + nimpp - 1 221 END DO 222 DO jj = 1, jpj 223 mjg(jj) = jj + njmpp - 1 224 END DO 225 ! ! global domain indices ==> local domain indices 226 ! ! (return (m.0,m.1)=(1,0) if data domain gridpoint is to the west/south of the 227 ! ! local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain. 228 DO ji = 1, jpiglo 229 mi0(ji) = MAX( 1 , MIN( ji - nimpp + 1, jpi+1 ) ) 230 mi1(ji) = MAX( 0 , MIN( ji - nimpp + 1, jpi ) ) 231 END DO 232 DO jj = 1, jpjglo 233 mj0(jj) = MAX( 1 , MIN( jj - njmpp + 1, jpj+1 ) ) 234 mj1(jj) = MAX( 0 , MIN( jj - njmpp + 1, jpj ) ) 235 END DO 236 IF(lwp) THEN ! control print 237 WRITE(numout,*) 238 WRITE(numout,*) 'dom_glo : domain: global <<==>> local ' 239 WRITE(numout,*) '~~~~~~~ ' 240 WRITE(numout,*) ' global domain: jpiglo = ', jpiglo, ' jpjglo = ', jpjglo, ' jpkglo = ', jpkglo 241 WRITE(numout,*) ' local domain: jpi = ', jpi , ' jpj = ', jpj , ' jpk = ', jpk 242 WRITE(numout,*) 243 WRITE(numout,*) ' conversion from local to global domain indices (and vise versa) done' 244 IF( nn_print >= 1 ) THEN 245 WRITE(numout,*) 246 WRITE(numout,*) ' conversion local ==> global i-index domain' 247 WRITE(numout,25) (mig(ji),ji = 1,jpi) 248 WRITE(numout,*) 249 WRITE(numout,*) ' conversion global ==> local i-index domain' 250 WRITE(numout,*) ' starting index' 251 WRITE(numout,25) (mi0(ji),ji = 1,jpiglo) 252 WRITE(numout,*) ' ending index' 253 WRITE(numout,25) (mi1(ji),ji = 1,jpiglo) 254 WRITE(numout,*) 255 WRITE(numout,*) ' conversion local ==> global j-index domain' 256 WRITE(numout,25) (mjg(jj),jj = 1,jpj) 257 WRITE(numout,*) 258 WRITE(numout,*) ' conversion global ==> local j-index domain' 259 WRITE(numout,*) ' starting index' 260 WRITE(numout,25) (mj0(jj),jj = 1,jpjglo) 261 WRITE(numout,*) ' ending index' 262 WRITE(numout,25) (mj1(jj),jj = 1,jpjglo) 263 ENDIF 264 ENDIF 265 25 FORMAT( 100(10x,19i4,/) ) 266 ! 267 END SUBROUTINE dom_glo 149 268 150 269 … … 161 280 USE ioipsl 162 281 NAMELIST/namrun/ cn_ocerst_indir, cn_ocerst_outdir, nn_stocklist, ln_rst_list, & 163 282 & nn_no , cn_exp , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl , & 164 283 & nn_it000, nn_itend , nn_date0 , nn_time0 , nn_leapy , nn_istate , & 165 284 & nn_stock, nn_write , ln_mskland , ln_clobber , nn_chunksz, nn_euler , & 166 285 & ln_cfmeta, ln_iscpl 167 NAMELIST/namdom/ nn_bathy, rn_bathy , rn_e3zps_min, rn_e3zps_rat, nn_msh, rn_hmin, rn_isfhmin, & 168 & rn_atfp , rn_rdt , nn_closea , ln_crs , jphgr_msh , & 169 & ppglam0, ppgphi0, ppe1_deg, ppe2_deg, ppe1_m, ppe2_m, & 170 & ppsur, ppa0, ppa1, ppkth, ppacr, ppdzmin, pphmax, ldbletanh, & 171 & ppa2, ppkth2, ppacr2 286 NAMELIST/namdom/ ln_linssh, nn_closea, nn_msh, rn_isfhmin, rn_rdt, rn_atfp, ln_crs 172 287 #if defined key_netcdf4 173 288 NAMELIST/namnc4/ nn_nchunks_i, nn_nchunks_j, nn_nchunks_k, ln_nc4zip … … 175 290 INTEGER :: ios ! Local integer output status for namelist read 176 291 !!---------------------------------------------------------------------- 177 292 ! 178 293 REWIND( numnam_ref ) ! Namelist namrun in reference namelist : Parameters of the run 179 294 READ ( numnam_ref, namrun, IOSTAT = ios, ERR = 901) 180 295 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namrun in reference namelist', lwp ) 181 296 ! 182 297 REWIND( numnam_cfg ) ! Namelist namrun in configuration namelist : Parameters of the run 183 298 READ ( numnam_cfg, namrun, IOSTAT = ios, ERR = 902 ) … … 235 350 neuler = 0 236 351 ENDIF 237 238 352 ! ! control of output frequency 239 353 IF ( nstock == 0 .OR. nstock > nitend ) THEN … … 269 383 READ ( numnam_ref, namdom, IOSTAT = ios, ERR = 903) 270 384 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdom in reference namelist', lwp ) 271 272 385 ! 273 386 REWIND( numnam_cfg ) ! Namelist namdom in configuration namelist : space & time domain (bathymetry, mesh, timestep) … … 279 392 WRITE(numout,*) 280 393 WRITE(numout,*) ' Namelist namdom : space & time domain' 281 WRITE(numout,*) ' flag read/compute bathymetry nn_bathy = ', nn_bathy 282 WRITE(numout,*) ' Depth (if =0 bathy=jpkm1) rn_bathy = ', rn_bathy 283 WRITE(numout,*) ' min depth of the ocean (>0) or rn_hmin = ', rn_hmin 284 WRITE(numout,*) ' min number of ocean level (<0) ' 285 WRITE(numout,*) ' treshold to open the isf cavity rn_isfhmin = ', rn_isfhmin, ' (m)' 286 WRITE(numout,*) ' minimum thickness of partial rn_e3zps_min = ', rn_e3zps_min, ' (m)' 287 WRITE(numout,*) ' step level rn_e3zps_rat = ', rn_e3zps_rat 288 WRITE(numout,*) ' create mesh/mask file(s) nn_msh = ', nn_msh 394 WRITE(numout,*) ' linear free surface (=T) ln_linssh = ', ln_linssh 395 WRITE(numout,*) ' suppression of closed seas (=0) nn_closea = ', nn_closea 396 WRITE(numout,*) ' create mesh/mask file(s) nn_msh = ', nn_msh 289 397 WRITE(numout,*) ' = 0 no file created ' 290 398 WRITE(numout,*) ' = 1 mesh_mask ' 291 399 WRITE(numout,*) ' = 2 mesh and mask ' 292 400 WRITE(numout,*) ' = 3 mesh_hgr, msh_zgr and mask' 293 WRITE(numout,*) ' ocean time step rn_rdt = ', rn_rdt 294 WRITE(numout,*) ' asselin time filter parameter rn_atfp = ', rn_atfp 295 WRITE(numout,*) ' suppression of closed seas (=0) nn_closea = ', nn_closea 296 WRITE(numout,*) ' online coarsening of dynamical fields ln_crs = ', ln_crs 297 WRITE(numout,*) ' type of horizontal mesh jphgr_msh = ', jphgr_msh 298 WRITE(numout,*) ' longitude of first raw and column T-point ppglam0 = ', ppglam0 299 WRITE(numout,*) ' latitude of first raw and column T-point ppgphi0 = ', ppgphi0 300 WRITE(numout,*) ' zonal grid-spacing (degrees) ppe1_deg = ', ppe1_deg 301 WRITE(numout,*) ' meridional grid-spacing (degrees) ppe2_deg = ', ppe2_deg 302 WRITE(numout,*) ' zonal grid-spacing (degrees) ppe1_m = ', ppe1_m 303 WRITE(numout,*) ' meridional grid-spacing (degrees) ppe2_m = ', ppe2_m 304 WRITE(numout,*) ' ORCA r4, r2 and r05 coefficients ppsur = ', ppsur 305 WRITE(numout,*) ' ppa0 = ', ppa0 306 WRITE(numout,*) ' ppa1 = ', ppa1 307 WRITE(numout,*) ' ppkth = ', ppkth 308 WRITE(numout,*) ' ppacr = ', ppacr 309 WRITE(numout,*) ' Minimum vertical spacing ppdzmin = ', ppdzmin 310 WRITE(numout,*) ' Maximum depth pphmax = ', pphmax 311 WRITE(numout,*) ' Use double tanf function for vertical coordinates ldbletanh = ', ldbletanh 312 WRITE(numout,*) ' Double tanh function parameters ppa2 = ', ppa2 313 WRITE(numout,*) ' ppkth2 = ', ppkth2 314 WRITE(numout,*) ' ppacr2 = ', ppacr2 315 ENDIF 316 ! 317 ntopo = nn_bathy ! conversion DOCTOR names into model names (this should disappear soon) 318 e3zps_min = rn_e3zps_min 319 e3zps_rat = rn_e3zps_rat 320 nmsh = nn_msh 401 WRITE(numout,*) ' treshold to open the isf cavity rn_isfhmin = ', rn_isfhmin, ' (m)' 402 WRITE(numout,*) ' ocean time step rn_rdt = ', rn_rdt 403 WRITE(numout,*) ' asselin time filter parameter rn_atfp = ', rn_atfp 404 WRITE(numout,*) ' online coarsening of dynamical fields ln_crs = ', ln_crs 405 ENDIF 406 407 call flush( numout ) 408 ! 409 ! ! ! conversion DOCTOR names into model names (this should disappear soon) 321 410 atfp = rn_atfp 322 411 rdt = rn_rdt … … 327 416 READ ( numnam_ref, namnc4, IOSTAT = ios, ERR = 907) 328 417 907 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namnc4 in reference namelist', lwp ) 329 418 ! 330 419 REWIND( numnam_cfg ) ! Namelist namnc4 in configuration namelist : NETCDF 331 420 READ ( numnam_cfg, namnc4, IOSTAT = ios, ERR = 908 ) … … 378 467 ze1max = MAXVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 379 468 ze2max = MAXVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 380 469 ! 381 470 iloc = MINLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 382 471 iimi1 = iloc(1) + nimpp - 1 … … 405 494 406 495 407 SUBROUTINE dom_stiff 408 !!---------------------------------------------------------------------- 409 !! *** ROUTINE dom_stiff *** 410 !! 411 !! ** Purpose : Diagnose maximum grid stiffness/hydrostatic consistency 412 !! 413 !! ** Method : Compute Haney (1991) hydrostatic condition ratio 414 !! Save the maximum in the vertical direction 415 !! (this number is only relevant in s-coordinates) 416 !! 417 !! Haney, R. L., 1991: On the pressure gradient force 418 !! over steep topography in sigma coordinate ocean models. 419 !! J. Phys. Oceanogr., 21, 610???619. 420 !!---------------------------------------------------------------------- 421 INTEGER :: ji, jj, jk 422 REAL(wp) :: zrxmax 423 REAL(wp), DIMENSION(4) :: zr1 424 !!---------------------------------------------------------------------- 425 rx1(:,:) = 0._wp 426 zrxmax = 0._wp 427 zr1(:) = 0._wp 428 ! 429 DO ji = 2, jpim1 430 DO jj = 2, jpjm1 431 DO jk = 1, jpkm1 432 zr1(1) = ABS( ( gdepw_0(ji ,jj,jk )-gdepw_0(ji-1,jj,jk ) & 433 & +gdepw_0(ji ,jj,jk+1)-gdepw_0(ji-1,jj,jk+1) ) & 434 & / ( gdepw_0(ji ,jj,jk )+gdepw_0(ji-1,jj,jk ) & 435 & -gdepw_0(ji ,jj,jk+1)-gdepw_0(ji-1,jj,jk+1) + rsmall ) ) * umask(ji-1,jj,jk) 436 zr1(2) = ABS( ( gdepw_0(ji+1,jj,jk )-gdepw_0(ji ,jj,jk ) & 437 & +gdepw_0(ji+1,jj,jk+1)-gdepw_0(ji ,jj,jk+1) ) & 438 & / ( gdepw_0(ji+1,jj,jk )+gdepw_0(ji ,jj,jk ) & 439 & -gdepw_0(ji+1,jj,jk+1)-gdepw_0(ji ,jj,jk+1) + rsmall ) ) * umask(ji ,jj,jk) 440 zr1(3) = ABS( ( gdepw_0(ji,jj+1,jk )-gdepw_0(ji,jj ,jk ) & 441 & +gdepw_0(ji,jj+1,jk+1)-gdepw_0(ji,jj ,jk+1) ) & 442 & / ( gdepw_0(ji,jj+1,jk )+gdepw_0(ji,jj ,jk ) & 443 & -gdepw_0(ji,jj+1,jk+1)-gdepw_0(ji,jj ,jk+1) + rsmall ) ) * vmask(ji,jj ,jk) 444 zr1(4) = ABS( ( gdepw_0(ji,jj ,jk )-gdepw_0(ji,jj-1,jk ) & 445 & +gdepw_0(ji,jj ,jk+1)-gdepw_0(ji,jj-1,jk+1) ) & 446 & / ( gdepw_0(ji,jj ,jk )+gdepw_0(ji,jj-1,jk ) & 447 & -gdepw_0(ji,jj ,jk+1)-gdepw_0(ji,jj-1,jk+1) + rsmall ) ) * vmask(ji,jj-1,jk) 448 zrxmax = MAXVAL( zr1(1:4) ) 449 rx1(ji,jj) = MAX( rx1(ji,jj) , zrxmax ) 450 END DO 451 END DO 452 END DO 453 CALL lbc_lnk( rx1, 'T', 1. ) 454 ! 455 zrxmax = MAXVAL( rx1 ) 456 ! 457 IF( lk_mpp ) CALL mpp_max( zrxmax ) ! max over the global domain 458 ! 459 IF(lwp) THEN 460 WRITE(numout,*) 461 WRITE(numout,*) 'dom_stiff : maximum grid stiffness ratio: ', zrxmax 462 WRITE(numout,*) '~~~~~~~~~' 463 ENDIF 464 ! 465 END SUBROUTINE dom_stiff 496 SUBROUTINE domain_cfg( ldtxt, cd_cfg, kk_cfg, kpi, kpj, kpk, kperio ) 497 !!---------------------------------------------------------------------- 498 !! *** ROUTINE dom_nam *** 499 !! 500 !! ** Purpose : read the domain size in domain configuration file 501 !! 502 !! ** Method : 503 !! 504 !!---------------------------------------------------------------------- 505 CHARACTER(len=*), DIMENSION(:), INTENT(out) :: ldtxt ! stored print information 506 CHARACTER(len=*) , INTENT(out) :: cd_cfg ! configuration name 507 INTEGER , INTENT(out) :: kk_cfg ! configuration resolution 508 INTEGER , INTENT(out) :: kpi, kpj, kpk ! global domain sizes 509 INTEGER , INTENT(out) :: kperio ! lateral global domain b.c. 510 ! 511 INTEGER :: inum, ii ! local integer 512 REAL(wp) :: zorca_res ! local scalars 513 REAL(wp) :: ziglo, zjglo, zkglo, zperio ! - - 514 !!---------------------------------------------------------------------- 515 ! 516 ii = 1 517 WRITE(ldtxt(ii),*) ' ' ; ii = ii+1 518 WRITE(ldtxt(ii),*) 'domain_cfg : domain size read in', TRIM( cn_domcfg ), ' file' ; ii = ii+1 519 WRITE(ldtxt(ii),*) '~~~~~~~~~~ ' ; ii = ii+1 520 ! 521 CALL iom_open( cn_domcfg, inum ) 522 ! 523 ! !- ORCA family specificity 524 IF( iom_varid( inum, 'ORCA' , ldstop = .FALSE. ) > 0 .AND. & 525 & iom_varid( inum, 'ORCA_index' , ldstop = .FALSE. ) > 0 ) THEN 526 ! 527 cd_cfg = 'ORCA' 528 CALL iom_get( inum, 'ORCA_index', zorca_res ) ; kk_cfg = INT( zorca_res ) 529 ! 530 WRITE(ldtxt(ii),*) ' ' ; ii = ii+1 531 WRITE(ldtxt(ii),*) ' ==>>> ORCA configuration ' ; ii = ii+1 532 WRITE(ldtxt(ii),*) ' ' ; ii = ii+1 533 ! 534 ELSE !- cd_cfg & k_cfg are not used 535 cd_cfg = 'UNKNOWN' 536 kk_cfg = -9999999 537 ENDIF 538 ! 539 CALL iom_get( inum, 'jpiglo', ziglo ) ; kpi = INT( ziglo ) 540 CALL iom_get( inum, 'jpjglo', zjglo ) ; kpj = INT( zjglo ) 541 CALL iom_get( inum, 'jpkglo', zkglo ) ; kpk = INT( zkglo ) 542 CALL iom_get( inum, 'jperio', zperio ) ; kperio = INT( zperio ) 543 CALL iom_close( inum ) 544 ! 545 WRITE(ldtxt(ii),*) ' cn_cfg = ', TRIM(cd_cfg), ' nn_cfg = ', kk_cfg ; ii = ii+1 546 WRITE(ldtxt(ii),*) ' jpiglo = ', kpi ; ii = ii+1 547 WRITE(ldtxt(ii),*) ' jpjglo = ', kpj ; ii = ii+1 548 WRITE(ldtxt(ii),*) ' jpkglo = ', kpk ; ii = ii+1 549 WRITE(ldtxt(ii),*) ' type of global domain lateral boundary jperio = ', kperio ; ii = ii+1 550 ! 551 END SUBROUTINE domain_cfg 552 553 554 SUBROUTINE cfg_write 555 !!---------------------------------------------------------------------- 556 !! *** ROUTINE cfg_write *** 557 !! 558 !! ** Purpose : Create the "cn_domcfg_out" file, a NetCDF file which 559 !! contains all the ocean domain informations required to 560 !! define an ocean configuration. 561 !! 562 !! ** Method : Write in a file all the arrays required to set up an 563 !! ocean configuration. 564 !! 565 !! ** output file : domcfg_out.nc : domain size, characteristics, horizontal 566 !! mesh, Coriolis parameter, and vertical scale factors 567 !! NB: also contain ORCA family information 568 !!---------------------------------------------------------------------- 569 INTEGER :: ji, jj, jk ! dummy loop indices 570 INTEGER :: izco, izps, isco, icav 571 INTEGER :: inum ! local units 572 CHARACTER(len=21) :: clnam ! filename (mesh and mask informations) 573 REAL(wp), DIMENSION(jpi,jpj) :: z2d ! workspace 574 !!---------------------------------------------------------------------- 575 ! 576 IF(lwp) WRITE(numout,*) 577 IF(lwp) WRITE(numout,*) 'cfg_write : create the domain configuration file (', TRIM(cn_domcfg_out),'.nc)' 578 IF(lwp) WRITE(numout,*) '~~~~~~~~~' 579 ! 580 ! ! ============================= ! 581 ! ! create 'domcfg_out.nc' file ! 582 ! ! ============================= ! 583 ! 584 clnam = 'domcfg_out' ! filename (configuration information) 585 CALL iom_open( TRIM(clnam), inum, ldwrt = .TRUE., kiolib = jprstlib ) 586 587 ! 588 ! !== ORCA family specificities ==! 589 IF( cn_cfg == "ORCA" ) THEN 590 CALL iom_rstput( 0, 0, inum, 'ORCA' , 1._wp , ktype = jp_i4 ) 591 CALL iom_rstput( 0, 0, inum, 'ORCA_index', REAL( nn_cfg, wp), ktype = jp_i4 ) 592 ENDIF 593 ! 594 ! !== global domain size ==! 595 ! 596 CALL iom_rstput( 0, 0, inum, 'jpiglo', REAL( jpiglo, wp), ktype = jp_i4 ) 597 CALL iom_rstput( 0, 0, inum, 'jpjglo', REAL( jpjglo, wp), ktype = jp_i4 ) 598 CALL iom_rstput( 0, 0, inum, 'jpkglo', REAL( jpk , wp), ktype = jp_i4 ) 599 ! 600 ! !== domain characteristics ==! 601 ! 602 ! ! lateral boundary of the global domain 603 CALL iom_rstput( 0, 0, inum, 'jperio', REAL( jperio, wp), ktype = jp_i4 ) 604 ! 605 ! ! type of vertical coordinate 606 IF( ln_zco ) THEN ; izco = 1 ; ELSE ; izco = 0 ; ENDIF 607 IF( ln_zps ) THEN ; izps = 1 ; ELSE ; izps = 0 ; ENDIF 608 IF( ln_sco ) THEN ; isco = 1 ; ELSE ; isco = 0 ; ENDIF 609 CALL iom_rstput( 0, 0, inum, 'ln_zco' , REAL( izco, wp), ktype = jp_i4 ) 610 CALL iom_rstput( 0, 0, inum, 'ln_zps' , REAL( izps, wp), ktype = jp_i4 ) 611 CALL iom_rstput( 0, 0, inum, 'ln_sco' , REAL( isco, wp), ktype = jp_i4 ) 612 ! 613 ! ! ocean cavities under iceshelves 614 IF( ln_isfcav ) THEN ; icav = 1 ; ELSE ; icav = 0 ; ENDIF 615 CALL iom_rstput( 0, 0, inum, 'ln_isfcav', REAL( icav, wp), ktype = jp_i4 ) 616 ! 617 ! !== horizontal mesh ! 618 ! 619 CALL iom_rstput( 0, 0, inum, 'glamt', glamt, ktype = jp_r8 ) ! latitude 620 CALL iom_rstput( 0, 0, inum, 'glamu', glamu, ktype = jp_r8 ) 621 CALL iom_rstput( 0, 0, inum, 'glamv', glamv, ktype = jp_r8 ) 622 CALL iom_rstput( 0, 0, inum, 'glamf', glamf, ktype = jp_r8 ) 623 ! 624 CALL iom_rstput( 0, 0, inum, 'gphit', gphit, ktype = jp_r8 ) ! longitude 625 CALL iom_rstput( 0, 0, inum, 'gphiu', gphiu, ktype = jp_r8 ) 626 CALL iom_rstput( 0, 0, inum, 'gphiv', gphiv, ktype = jp_r8 ) 627 CALL iom_rstput( 0, 0, inum, 'gphif', gphif, ktype = jp_r8 ) 628 ! 629 CALL iom_rstput( 0, 0, inum, 'e1t' , e1t , ktype = jp_r8 ) ! i-scale factors (e1.) 630 CALL iom_rstput( 0, 0, inum, 'e1u' , e1u , ktype = jp_r8 ) 631 CALL iom_rstput( 0, 0, inum, 'e1v' , e1v , ktype = jp_r8 ) 632 CALL iom_rstput( 0, 0, inum, 'e1f' , e1f , ktype = jp_r8 ) 633 ! 634 CALL iom_rstput( 0, 0, inum, 'e2t' , e2t , ktype = jp_r8 ) ! j-scale factors (e2.) 635 CALL iom_rstput( 0, 0, inum, 'e2u' , e2u , ktype = jp_r8 ) 636 CALL iom_rstput( 0, 0, inum, 'e2v' , e2v , ktype = jp_r8 ) 637 CALL iom_rstput( 0, 0, inum, 'e2f' , e2f , ktype = jp_r8 ) 638 ! 639 CALL iom_rstput( 0, 0, inum, 'ff_f' , ff_f , ktype = jp_r8 ) ! coriolis factor 640 CALL iom_rstput( 0, 0, inum, 'ff_t' , ff_t , ktype = jp_r8 ) 641 ! 642 ! !== vertical mesh ==! 643 ! 644 CALL iom_rstput( 0, 0, inum, 'e3t_1d' , e3t_1d , ktype = jp_r8 ) ! reference 1D-coordinate 645 CALL iom_rstput( 0, 0, inum, 'e3w_1d' , e3w_1d , ktype = jp_r8 ) 646 ! 647 CALL iom_rstput( 0, 0, inum, 'e3t_0' , e3t_0 , ktype = jp_r8 ) ! vertical scale factors 648 CALL iom_rstput( 0, 0, inum, 'e3u_0' , e3u_0 , ktype = jp_r8 ) 649 CALL iom_rstput( 0, 0, inum, 'e3v_0' , e3v_0 , ktype = jp_r8 ) 650 CALL iom_rstput( 0, 0, inum, 'e3f_0' , e3f_0 , ktype = jp_r8 ) 651 CALL iom_rstput( 0, 0, inum, 'e3w_0' , e3w_0 , ktype = jp_r8 ) 652 CALL iom_rstput( 0, 0, inum, 'e3uw_0' , e3uw_0 , ktype = jp_r8 ) 653 CALL iom_rstput( 0, 0, inum, 'e3vw_0' , e3vw_0 , ktype = jp_r8 ) 654 ! 655 ! !== wet top and bottom level ==! (caution: multiplied by ssmask) 656 ! 657 CALL iom_rstput( 0, 0, inum, 'top_level' , REAL( mikt, wp )*ssmask , ktype = jp_i4 ) ! nb of ocean T-points (ISF) 658 CALL iom_rstput( 0, 0, inum, 'bottom_level' , REAL( mbkt, wp )*ssmask , ktype = jp_i4 ) ! nb of ocean T-points 659 ! 660 IF( ln_sco ) THEN ! s-coordinate: store grid stiffness ratio (Not required anyway) 661 CALL dom_stiff( z2d ) 662 CALL iom_rstput( 0, 0, inum, 'stiffness', z2d ) ! ! Max. grid stiffness ratio 663 ENDIF 664 ! 665 ! ! ============================ 666 ! ! close the files 667 ! ! ============================ 668 CALL iom_close( inum ) 669 ! 670 END SUBROUTINE cfg_write 466 671 467 672 !!====================================================================== -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/domhgr.F90
r6140 r7421 16 16 !! 3.7 ! 2015-09 (G. Madec, S. Flavoni) add cell surface and their inverse 17 17 !! add optional read of e1e2u & e1e2v 18 !! - ! 2016-04 (S. Flavoni, G. Madec) new configuration interface: read or usrdef.F90 18 19 !!---------------------------------------------------------------------- 19 20 20 21 !!---------------------------------------------------------------------- 21 22 !! dom_hgr : initialize the horizontal mesh 22 !! hgr_read : read "coordinate" NetCDFfile23 !! hgr_read : read horizontal information in the domain configuration file 23 24 !!---------------------------------------------------------------------- 24 25 USE dom_oce ! ocean space and time domain 26 USE par_oce ! ocean space and time domain 25 27 USE phycst ! physical constants 26 USE domwri ! write 'meshmask.nc' & 'coordinate_e1e2u_v.nc' files28 USE usrdef_hgr ! User defined routine 27 29 ! 28 30 USE in_out_manager ! I/O manager 31 USE iom ! I/O library 29 32 USE lib_mpp ! MPP library 30 33 USE timing ! Timing … … 33 36 PRIVATE 34 37 35 REAL(wp) :: glam0, gphi0 ! variables corresponding to parameters ppglam0 ppgphi0 set in par_oce36 37 38 PUBLIC dom_hgr ! called by domain.F90 38 39 39 40 !!---------------------------------------------------------------------- 40 !! NEMO/OPA 3.7 , NEMO Consortium (201 4)41 !! NEMO/OPA 3.7 , NEMO Consortium (2016) 41 42 !! $Id$ 42 43 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 48 49 !! *** ROUTINE dom_hgr *** 49 50 !! 50 !! ** Purpose : Compute the geographical position (in degre) of the 51 !! model grid-points, the horizontal scale factors (in meters) and 52 !! the Coriolis factor (in s-1). 53 !! 54 !! ** Method : The geographical position of the model grid-points is 55 !! defined from analytical functions, fslam and fsphi, the deriva- 56 !! tives of which gives the horizontal scale factors e1,e2. 57 !! Defining two function fslam and fsphi and their derivatives in 58 !! the two horizontal directions (fse1 and fse2), the model grid- 59 !! point position and scale factors are given by: 60 !! t-point: 61 !! glamt(i,j) = fslam(i ,j ) e1t(i,j) = fse1(i ,j ) 62 !! gphit(i,j) = fsphi(i ,j ) e2t(i,j) = fse2(i ,j ) 63 !! u-point: 64 !! glamu(i,j) = fslam(i+1/2,j ) e1u(i,j) = fse1(i+1/2,j ) 65 !! gphiu(i,j) = fsphi(i+1/2,j ) e2u(i,j) = fse2(i+1/2,j ) 66 !! v-point: 67 !! glamv(i,j) = fslam(i ,j+1/2) e1v(i,j) = fse1(i ,j+1/2) 68 !! gphiv(i,j) = fsphi(i ,j+1/2) e2v(i,j) = fse2(i ,j+1/2) 69 !! f-point: 70 !! glamf(i,j) = fslam(i+1/2,j+1/2) e1f(i,j) = fse1(i+1/2,j+1/2) 71 !! gphif(i,j) = fsphi(i+1/2,j+1/2) e2f(i,j) = fse2(i+1/2,j+1/2) 72 !! Where fse1 and fse2 are defined by: 73 !! fse1(i,j) = ra * rad * SQRT( (cos(phi) di(fslam))**2 74 !! + di(fsphi) **2 )(i,j) 75 !! fse2(i,j) = ra * rad * SQRT( (cos(phi) dj(fslam))**2 76 !! + dj(fsphi) **2 )(i,j) 77 !! 78 !! The coriolis factor is given at z-point by: 79 !! ff = 2.*omega*sin(gphif) (in s-1) 80 !! 81 !! This routine is given as an example, it must be modified 82 !! following the user s desiderata. nevertheless, the output as 83 !! well as the way to compute the model grid-point position and 84 !! horizontal scale factors must be respected in order to insure 85 !! second order accuracy schemes. 86 !! 87 !! N.B. If the domain is periodic, verify that scale factors are also 88 !! periodic, and the coriolis term again. 89 !! 90 !! ** Action : - define glamt, glamu, glamv, glamf: longitude of t-, 91 !! u-, v- and f-points (in degre) 92 !! - define gphit, gphiu, gphiv, gphit: latitude of t-, 93 !! u-, v- and f-points (in degre) 94 !! define e1t, e2t, e1u, e2u, e1v, e2v, e1f, e2f: horizontal 95 !! scale factors (in meters) at t-, u-, v-, and f-points. 96 !! define ff: coriolis factor at f-point 97 !! 98 !! References : Marti, Madec and Delecluse, 1992, JGR 99 !! Madec, Imbard, 1996, Clim. Dyn. 100 !!---------------------------------------------------------------------- 101 INTEGER :: ji, jj ! dummy loop indices 102 INTEGER :: ii0, ii1, ij0, ij1 ! temporary integers 103 INTEGER :: ijeq ! index of equator T point (used in case 4) 104 REAL(wp) :: zti, zui, zvi, zfi ! local scalars 105 REAL(wp) :: ztj, zuj, zvj, zfj ! - - 106 REAL(wp) :: zphi0, zbeta, znorme ! 107 REAL(wp) :: zarg, zf0, zminff, zmaxff 108 REAL(wp) :: zlam1, zcos_alpha, zim1 , zjm1 , ze1, ze1deg 109 REAL(wp) :: zphi1, zsin_alpha, zim05, zjm05 110 INTEGER :: isrow ! index for ORCA1 starting row 111 INTEGER :: ie1e2u_v ! fag for u- & v-surface read in coordinate file or not 51 !! ** Purpose : Read or compute the geographical position (in degrees) 52 !! of the model grid-points, the horizontal scale factors (in meters), 53 !! the associated horizontal metrics, and the Coriolis factor (in s-1). 54 !! 55 !! ** Method : Controlled by ln_read_cfg logical 56 !! =T : all needed arrays are read in mesh_mask.nc file 57 !! =F : user-defined configuration, all needed arrays 58 !! are computed in usr-def_hgr subroutine 59 !! 60 !! If Coriolis factor is neither read nor computed (iff=0) 61 !! it is computed from gphit assuming that the mesh is 62 !! defined on the sphere : 63 !! ff = 2.*omega*sin(gphif) (in s-1) 64 !! 65 !! If u- & v-surfaces are neither read nor computed (ie1e2u_v=0) 66 !! (i.e. no use of reduced scale factors in some straits) 67 !! they are computed from e1u, e2u, e1v and e2v as: 68 !! e1e2u = e1u*e2u and e1e2v = e1v*e2v 69 !! 70 !! ** Action : - define longitude & latitude of t-, u-, v- and f-points (in degrees) 71 !! - define Coriolis parameter at f-point (in 1/s) 72 !! - define i- & j-scale factors at t-, u-, v- and f-points (in meters) 73 !! - define associated horizontal metrics at t-, u-, v- and f-points 74 !! (inverse of scale factors 1/e1 & 1/e2, surface e1*e2, ratios e1/e2 & e2/e1) 75 !!---------------------------------------------------------------------- 76 INTEGER :: ji, jj ! dummy loop indices 77 INTEGER :: ie1e2u_v ! flag for u- & v-surfaces 78 INTEGER :: iff ! flag for Coriolis parameter 112 79 !!---------------------------------------------------------------------- 113 80 ! … … 117 84 WRITE(numout,*) 118 85 WRITE(numout,*) 'dom_hgr : define the horizontal mesh from ithe following par_oce parameters ' 119 WRITE(numout,*) '~~~~~~~ type of horizontal mesh jphgr_msh = ', jphgr_msh 120 WRITE(numout,*) ' position of the first row and ppglam0 = ', ppglam0 121 WRITE(numout,*) ' column grid-point (degrees) ppgphi0 = ', ppgphi0 122 WRITE(numout,*) ' zonal grid-spacing (degrees) ppe1_deg = ', ppe1_deg 123 WRITE(numout,*) ' meridional grid-spacing (degrees) ppe2_deg = ', ppe2_deg 124 WRITE(numout,*) ' zonal grid-spacing (meters) ppe1_m = ', ppe1_m 125 WRITE(numout,*) ' meridional grid-spacing (meters) ppe2_m = ', ppe2_m 126 ENDIF 127 ! 128 ! 129 SELECT CASE( jphgr_msh ) ! type of horizontal mesh 130 ! 131 CASE ( 0 ) !== read in coordinate.nc file ==! 132 ! 86 WRITE(numout,*) '~~~~~~~ ' 87 WRITE(numout,*) ' namcfg : read (=T) or user defined (=F) configuration ln_read_cfg = ', ln_read_cfg 88 ENDIF 89 ! 90 ! 91 IF( ln_read_cfg ) THEN !== read in mesh_mask.nc file ==! 133 92 IF(lwp) WRITE(numout,*) 134 IF(lwp) WRITE(numout,*) ' curvilinear coordinate on the sphere read in "coordinate" file' 135 ! 136 ie1e2u_v = 0 ! set to unread e1e2u and e1e2v 137 ! 138 CALL hgr_read( ie1e2u_v ) ! read the coordinate.nc file 139 ! 140 IF( ie1e2u_v == 0 ) THEN ! e1e2u and e1e2v have not been read: compute them 141 ! ! e2u and e1v does not include a reduction in some strait: apply reduction 142 e1e2u (:,:) = e1u(:,:) * e2u(:,:) 143 e1e2v (:,:) = e1v(:,:) * e2v(:,:) 93 IF(lwp) WRITE(numout,*) ' read horizontal mesh in ', TRIM( cn_domcfg ), ' file' 94 ! 95 CALL hgr_read ( glamt , glamu , glamv , glamf , & ! geographic position (required) 96 & gphit , gphiu , gphiv , gphif , & ! - - 97 & iff , ff_f , ff_t , & ! Coriolis parameter (if not on the sphere) 98 & e1t , e1u , e1v , e1f , & ! scale factors (required) 99 & e2t , e2u , e2v , e2f , & ! - - - 100 & ie1e2u_v , e1e2u , e1e2v ) ! u- & v-surfaces (if gridsize reduction in some straits) 101 ! 102 ELSE !== User defined configuration ==! 103 IF(lwp) WRITE(numout,*) 104 IF(lwp) WRITE(numout,*) ' User defined horizontal mesh (usr_def_hgr)' 105 ! 106 CALL usr_def_hgr( glamt , glamu , glamv , glamf , & ! geographic position (required) 107 & gphit , gphiu , gphiv , gphif , & ! 108 & iff , ff_f , ff_t , & ! Coriolis parameter (if domain not on the sphere) 109 & e1t , e1u , e1v , e1f , & ! scale factors (required) 110 & e2t , e2u , e2v , e2f , & ! 111 & ie1e2u_v , e1e2u , e1e2v ) ! u- & v-surfaces (if gridsize reduction is used in strait(s)) 112 ! 113 ENDIF 114 ! 115 ! !== Coriolis parameter ==! (if necessary) 116 ! 117 IF( iff == 0 ) THEN ! Coriolis parameter has not been defined 118 IF(lwp) WRITE(numout,*) ' Coriolis parameter calculated on the sphere from gphif & gphit' 119 ff_f(:,:) = 2. * omega * SIN( rad * gphif(:,:) ) ! compute it on the sphere at f-point 120 ff_t(:,:) = 2. * omega * SIN( rad * gphit(:,:) ) ! - - - at t-point 121 ELSE 122 IF( ln_read_cfg ) THEN 123 IF(lwp) WRITE(numout,*) ' Coriolis parameter have been read in ', TRIM( cn_domcfg ), ' file' 124 ELSE 125 IF(lwp) WRITE(numout,*) ' Coriolis parameter have been set in usr_def_hgr routine' 144 126 ENDIF 145 ! 146 CASE ( 1 ) !== geographical mesh on the sphere with regular (in degree) grid-spacing ==! 147 ! 148 IF(lwp) WRITE(numout,*) 149 IF(lwp) WRITE(numout,*) ' geographical mesh on the sphere with regular grid-spacing' 150 IF(lwp) WRITE(numout,*) ' given by ppe1_deg and ppe2_deg' 151 ! 152 DO jj = 1, jpj 153 DO ji = 1, jpi 154 zti = REAL( ji - 1 + nimpp - 1 ) ; ztj = REAL( jj - 1 + njmpp - 1 ) 155 zui = REAL( ji - 1 + nimpp - 1 ) + 0.5 ; zuj = REAL( jj - 1 + njmpp - 1 ) 156 zvi = REAL( ji - 1 + nimpp - 1 ) ; zvj = REAL( jj - 1 + njmpp - 1 ) + 0.5 157 zfi = REAL( ji - 1 + nimpp - 1 ) + 0.5 ; zfj = REAL( jj - 1 + njmpp - 1 ) + 0.5 158 ! Longitude 159 glamt(ji,jj) = ppglam0 + ppe1_deg * zti 160 glamu(ji,jj) = ppglam0 + ppe1_deg * zui 161 glamv(ji,jj) = ppglam0 + ppe1_deg * zvi 162 glamf(ji,jj) = ppglam0 + ppe1_deg * zfi 163 ! Latitude 164 gphit(ji,jj) = ppgphi0 + ppe2_deg * ztj 165 gphiu(ji,jj) = ppgphi0 + ppe2_deg * zuj 166 gphiv(ji,jj) = ppgphi0 + ppe2_deg * zvj 167 gphif(ji,jj) = ppgphi0 + ppe2_deg * zfj 168 ! e1 169 e1t(ji,jj) = ra * rad * COS( rad * gphit(ji,jj) ) * ppe1_deg 170 e1u(ji,jj) = ra * rad * COS( rad * gphiu(ji,jj) ) * ppe1_deg 171 e1v(ji,jj) = ra * rad * COS( rad * gphiv(ji,jj) ) * ppe1_deg 172 e1f(ji,jj) = ra * rad * COS( rad * gphif(ji,jj) ) * ppe1_deg 173 ! e2 174 e2t(ji,jj) = ra * rad * ppe2_deg 175 e2u(ji,jj) = ra * rad * ppe2_deg 176 e2v(ji,jj) = ra * rad * ppe2_deg 177 e2f(ji,jj) = ra * rad * ppe2_deg 178 END DO 179 END DO 180 ! 181 CASE ( 2:3 ) !== f- or beta-plane with regular grid-spacing ==! 182 ! 183 IF(lwp) WRITE(numout,*) 184 IF(lwp) WRITE(numout,*) ' f- or beta-plane with regular grid-spacing' 185 IF(lwp) WRITE(numout,*) ' given by ppe1_m and ppe2_m' 186 ! 187 ! Position coordinates (in kilometers) 188 ! ========== 189 glam0 = 0._wp 190 gphi0 = - ppe2_m * 1.e-3 191 ! 192 #if defined key_agrif 193 IF ( cp_cfg == 'eel' .AND. jp_cfg == 6 ) THEN ! for EEL6 configuration only 194 IF( .NOT. Agrif_Root() ) THEN 195 glam0 = Agrif_Parent(glam0) + (Agrif_ix())*Agrif_Parent(ppe1_m) * 1.e-3 196 gphi0 = Agrif_Parent(gphi0) + (Agrif_iy())*Agrif_Parent(ppe2_m) * 1.e-3 197 ppe1_m = Agrif_Parent(ppe1_m)/Agrif_Rhox() 198 ppe2_m = Agrif_Parent(ppe2_m)/Agrif_Rhoy() 199 ENDIF 200 ENDIF 201 #endif 202 DO jj = 1, jpj 203 DO ji = 1, jpi 204 glamt(ji,jj) = glam0 + ppe1_m * 1.e-3 * ( REAL( ji - 1 + nimpp - 1 ) ) 205 glamu(ji,jj) = glam0 + ppe1_m * 1.e-3 * ( REAL( ji - 1 + nimpp - 1 ) + 0.5 ) 206 glamv(ji,jj) = glamt(ji,jj) 207 glamf(ji,jj) = glamu(ji,jj) 208 ! 209 gphit(ji,jj) = gphi0 + ppe2_m * 1.e-3 * ( REAL( jj - 1 + njmpp - 1 ) ) 210 gphiu(ji,jj) = gphit(ji,jj) 211 gphiv(ji,jj) = gphi0 + ppe2_m * 1.e-3 * ( REAL( jj - 1 + njmpp - 1 ) + 0.5 ) 212 gphif(ji,jj) = gphiv(ji,jj) 213 END DO 214 END DO 215 ! 216 ! Horizontal scale factors (in meters) 217 ! ====== 218 e1t(:,:) = ppe1_m ; e2t(:,:) = ppe2_m 219 e1u(:,:) = ppe1_m ; e2u(:,:) = ppe2_m 220 e1v(:,:) = ppe1_m ; e2v(:,:) = ppe2_m 221 e1f(:,:) = ppe1_m ; e2f(:,:) = ppe2_m 222 ! 223 CASE ( 4 ) !== geographical mesh on the sphere, isotropic MERCATOR type ==! 224 ! 225 IF(lwp) WRITE(numout,*) 226 IF(lwp) WRITE(numout,*) ' geographical mesh on the sphere, MERCATOR type' 227 IF(lwp) WRITE(numout,*) ' longitudinal/latitudinal spacing given by ppe1_deg' 228 IF ( ppgphi0 == -90 ) CALL ctl_stop( ' Mercator grid cannot start at south pole !!!! ' ) 229 ! 230 ! Find index corresponding to the equator, given the grid spacing e1_deg 231 ! and the (approximate) southern latitude ppgphi0. 232 ! This way we ensure that the equator is at a "T / U" point, when in the domain. 233 ! The formula should work even if the equator is outside the domain. 234 zarg = rpi / 4. - rpi / 180. * ppgphi0 / 2. 235 ijeq = ABS( 180./rpi * LOG( COS( zarg ) / SIN( zarg ) ) / ppe1_deg ) 236 IF( ppgphi0 > 0 ) ijeq = -ijeq 237 ! 238 IF(lwp) WRITE(numout,*) ' Index of the equator on the MERCATOR grid:', ijeq 239 ! 240 DO jj = 1, jpj 241 DO ji = 1, jpi 242 zti = REAL( ji - 1 + nimpp - 1 ) ; ztj = REAL( jj - ijeq + njmpp - 1 ) 243 zui = REAL( ji - 1 + nimpp - 1 ) + 0.5 ; zuj = REAL( jj - ijeq + njmpp - 1 ) 244 zvi = REAL( ji - 1 + nimpp - 1 ) ; zvj = REAL( jj - ijeq + njmpp - 1 ) + 0.5 245 zfi = REAL( ji - 1 + nimpp - 1 ) + 0.5 ; zfj = REAL( jj - ijeq + njmpp - 1 ) + 0.5 246 ! Longitude 247 glamt(ji,jj) = ppglam0 + ppe1_deg * zti 248 glamu(ji,jj) = ppglam0 + ppe1_deg * zui 249 glamv(ji,jj) = ppglam0 + ppe1_deg * zvi 250 glamf(ji,jj) = ppglam0 + ppe1_deg * zfi 251 ! Latitude 252 gphit(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* ztj ) ) 253 gphiu(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* zuj ) ) 254 gphiv(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* zvj ) ) 255 gphif(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* zfj ) ) 256 ! e1 257 e1t(ji,jj) = ra * rad * COS( rad * gphit(ji,jj) ) * ppe1_deg 258 e1u(ji,jj) = ra * rad * COS( rad * gphiu(ji,jj) ) * ppe1_deg 259 e1v(ji,jj) = ra * rad * COS( rad * gphiv(ji,jj) ) * ppe1_deg 260 e1f(ji,jj) = ra * rad * COS( rad * gphif(ji,jj) ) * ppe1_deg 261 ! e2 262 e2t(ji,jj) = ra * rad * COS( rad * gphit(ji,jj) ) * ppe1_deg 263 e2u(ji,jj) = ra * rad * COS( rad * gphiu(ji,jj) ) * ppe1_deg 264 e2v(ji,jj) = ra * rad * COS( rad * gphiv(ji,jj) ) * ppe1_deg 265 e2f(ji,jj) = ra * rad * COS( rad * gphif(ji,jj) ) * ppe1_deg 266 END DO 267 END DO 268 ! 269 CASE ( 5 ) !== beta-plane with regular grid-spacing and rotated domain ==! (GYRE configuration) 270 ! 271 IF(lwp) WRITE(numout,*) 272 IF(lwp) WRITE(numout,*) ' beta-plane with regular grid-spacing and rotated domain (GYRE configuration)' 273 IF(lwp) WRITE(numout,*) ' given by ppe1_m and ppe2_m' 274 ! 275 ! Position coordinates (in kilometers) 276 ! ========== 277 ! 278 ! angle 45deg and ze1=106.e+3 / jp_cfg forced -> zlam1 = -85deg, zphi1 = 29degN 279 zlam1 = -85._wp 280 zphi1 = 29._wp 281 ! resolution in meters 282 ze1 = 106000. / REAL( jp_cfg , wp ) 283 ! benchmark: forced the resolution to be about 100 km 284 IF( nbench /= 0 ) ze1 = 106000._wp 285 zsin_alpha = - SQRT( 2._wp ) * 0.5_wp 286 zcos_alpha = SQRT( 2._wp ) * 0.5_wp 287 ze1deg = ze1 / (ra * rad) 288 IF( nbench /= 0 ) ze1deg = ze1deg / REAL( jp_cfg , wp ) ! benchmark: keep the lat/+lon 289 ! ! at the right jp_cfg resolution 290 glam0 = zlam1 + zcos_alpha * ze1deg * REAL( jpjglo-2 , wp ) 291 gphi0 = zphi1 + zsin_alpha * ze1deg * REAL( jpjglo-2 , wp ) 292 ! 293 IF( nprint==1 .AND. lwp ) THEN 294 WRITE(numout,*) ' ze1', ze1, 'cosalpha', zcos_alpha, 'sinalpha', zsin_alpha 295 WRITE(numout,*) ' ze1deg', ze1deg, 'glam0', glam0, 'gphi0', gphi0 296 ENDIF 297 ! 298 DO jj = 1, jpj 299 DO ji = 1, jpi 300 zim1 = REAL( ji + nimpp - 1 ) - 1. ; zim05 = REAL( ji + nimpp - 1 ) - 1.5 301 zjm1 = REAL( jj + njmpp - 1 ) - 1. ; zjm05 = REAL( jj + njmpp - 1 ) - 1.5 302 ! 303 glamf(ji,jj) = glam0 + zim1 * ze1deg * zcos_alpha + zjm1 * ze1deg * zsin_alpha 304 gphif(ji,jj) = gphi0 - zim1 * ze1deg * zsin_alpha + zjm1 * ze1deg * zcos_alpha 305 ! 306 glamt(ji,jj) = glam0 + zim05 * ze1deg * zcos_alpha + zjm05 * ze1deg * zsin_alpha 307 gphit(ji,jj) = gphi0 - zim05 * ze1deg * zsin_alpha + zjm05 * ze1deg * zcos_alpha 308 ! 309 glamu(ji,jj) = glam0 + zim1 * ze1deg * zcos_alpha + zjm05 * ze1deg * zsin_alpha 310 gphiu(ji,jj) = gphi0 - zim1 * ze1deg * zsin_alpha + zjm05 * ze1deg * zcos_alpha 311 ! 312 glamv(ji,jj) = glam0 + zim05 * ze1deg * zcos_alpha + zjm1 * ze1deg * zsin_alpha 313 gphiv(ji,jj) = gphi0 - zim05 * ze1deg * zsin_alpha + zjm1 * ze1deg * zcos_alpha 314 END DO 315 END DO 316 ! 317 ! Horizontal scale factors (in meters) 318 ! ====== 319 e1t(:,:) = ze1 ; e2t(:,:) = ze1 320 e1u(:,:) = ze1 ; e2u(:,:) = ze1 321 e1v(:,:) = ze1 ; e2v(:,:) = ze1 322 e1f(:,:) = ze1 ; e2f(:,:) = ze1 323 ! 324 CASE DEFAULT 325 WRITE(ctmp1,*) ' bad flag value for jphgr_msh = ', jphgr_msh 326 CALL ctl_stop( ctmp1 ) 327 ! 328 END SELECT 329 330 ! associated horizontal metrics 331 ! ----------------------------- 127 ENDIF 128 129 ! 130 ! !== associated horizontal metrics ==! 332 131 ! 333 132 r1_e1t(:,:) = 1._wp / e1t(:,:) ; r1_e2t (:,:) = 1._wp / e2t(:,:) … … 338 137 e1e2t (:,:) = e1t(:,:) * e2t(:,:) ; r1_e1e2t(:,:) = 1._wp / e1e2t(:,:) 339 138 e1e2f (:,:) = e1f(:,:) * e2f(:,:) ; r1_e1e2f(:,:) = 1._wp / e1e2f(:,:) 340 IF( jphgr_msh /= 0 ) THEN ! e1e2u and e1e2v have not been set: compute them 341 e1e2u (:,:) = e1u(:,:) * e2u(:,:) 139 IF( ie1e2u_v == 0 ) THEN ! u- & v-surfaces have not been defined 140 IF(lwp) WRITE(numout,*) ' u- & v-surfaces calculated as e1 e2 product' 141 e1e2u (:,:) = e1u(:,:) * e2u(:,:) ! compute them 342 142 e1e2v (:,:) = e1v(:,:) * e2v(:,:) 343 ENDIF 344 r1_e1e2u(:,:) = 1._wp / e1e2u(:,:) ! compute their invert in both cases 143 ELSE 144 IF(lwp) WRITE(numout,*) ' u- & v-surfaces have been read in "mesh_mask" file:' 145 IF(lwp) WRITE(numout,*) ' grid size reduction in strait(s) is used' 146 ENDIF 147 r1_e1e2u(:,:) = 1._wp / e1e2u(:,:) ! compute their invert in any cases 345 148 r1_e1e2v(:,:) = 1._wp / e1e2v(:,:) 346 149 ! 347 150 e2_e1u(:,:) = e2u(:,:) / e1u(:,:) 348 151 e1_e2v(:,:) = e1v(:,:) / e2v(:,:) 349 350 IF( lwp .AND. nn_print >=1 .AND. .NOT.ln_rstart ) THEN ! Control print : Grid informations (if not restart) 351 WRITE(numout,*) 352 WRITE(numout,*) ' longitude and e1 scale factors' 353 WRITE(numout,*) ' ------------------------------' 354 WRITE(numout,9300) ( ji, glamt(ji,1), glamu(ji,1), & 355 glamv(ji,1), glamf(ji,1), & 356 e1t(ji,1), e1u(ji,1), & 357 e1v(ji,1), e1f(ji,1), ji = 1, jpi,10) 358 9300 FORMAT( 1x, i4, f8.2,1x, f8.2,1x, f8.2,1x, f8.2, 1x, & 359 f19.10, 1x, f19.10, 1x, f19.10, 1x, f19.10 ) 360 ! 361 WRITE(numout,*) 362 WRITE(numout,*) ' latitude and e2 scale factors' 363 WRITE(numout,*) ' -----------------------------' 364 WRITE(numout,9300) ( jj, gphit(1,jj), gphiu(1,jj), & 365 & gphiv(1,jj), gphif(1,jj), & 366 & e2t (1,jj), e2u (1,jj), & 367 & e2v (1,jj), e2f (1,jj), jj = 1, jpj, 10 ) 368 ENDIF 369 370 371 ! ================= ! 372 ! Coriolis factor ! 373 ! ================= ! 374 375 SELECT CASE( jphgr_msh ) ! type of horizontal mesh 376 ! 377 CASE ( 0, 1, 4 ) ! mesh on the sphere 378 ! 379 ff(:,:) = 2. * omega * SIN( rad * gphif(:,:) ) 380 ! 381 CASE ( 2 ) ! f-plane at ppgphi0 382 ! 383 ff(:,:) = 2. * omega * SIN( rad * ppgphi0 ) 384 ! 385 IF(lwp) WRITE(numout,*) ' f-plane: Coriolis parameter = constant = ', ff(1,1) 386 ! 387 CASE ( 3 ) ! beta-plane 388 ! 389 zbeta = 2. * omega * COS( rad * ppgphi0 ) / ra ! beta at latitude ppgphi0 390 zphi0 = ppgphi0 - REAL( jpjglo/2) * ppe2_m / ( ra * rad ) ! latitude of the first row F-points 391 ! 392 #if defined key_agrif 393 IF( cp_cfg == 'eel' .AND. jp_cfg == 6 ) THEN ! for EEL6 configuration only 394 IF( .NOT.Agrif_Root() ) THEN 395 zphi0 = ppgphi0 - REAL( Agrif_Parent(jpjglo)/2)*Agrif_Parent(ppe2_m) / (ra * rad) 396 ENDIF 397 ENDIF 398 #endif 399 zf0 = 2. * omega * SIN( rad * zphi0 ) ! compute f0 1st point south 400 ! 401 ff(:,:) = ( zf0 + zbeta * gphif(:,:) * 1.e+3 ) ! f = f0 +beta* y ( y=0 at south) 402 ! 403 IF(lwp) THEN 404 WRITE(numout,*) 405 WRITE(numout,*) ' Beta-plane: Beta parameter = constant = ', ff(nldi,nldj) 406 WRITE(numout,*) ' Coriolis parameter varies from ', ff(nldi,nldj),' to ', ff(nldi,nlej) 407 ENDIF 408 IF( lk_mpp ) THEN 409 zminff=ff(nldi,nldj) 410 zmaxff=ff(nldi,nlej) 411 CALL mpp_min( zminff ) ! min over the global domain 412 CALL mpp_max( zmaxff ) ! max over the global domain 413 IF(lwp) WRITE(numout,*) ' Coriolis parameter varies globally from ', zminff,' to ', zmaxff 414 END IF 415 ! 416 CASE ( 5 ) ! beta-plane and rotated domain (gyre configuration) 417 ! 418 zbeta = 2. * omega * COS( rad * ppgphi0 ) / ra ! beta at latitude ppgphi0 419 zphi0 = 15._wp ! latitude of the first row F-points 420 zf0 = 2. * omega * SIN( rad * zphi0 ) ! compute f0 1st point south 421 ! 422 ff(:,:) = ( zf0 + zbeta * ABS( gphif(:,:) - zphi0 ) * rad * ra ) ! f = f0 +beta* y ( y=0 at south) 423 ! 424 IF(lwp) THEN 425 WRITE(numout,*) 426 WRITE(numout,*) ' Beta-plane and rotated domain : ' 427 WRITE(numout,*) ' Coriolis parameter varies in this processor from ', ff(nldi,nldj),' to ', ff(nldi,nlej) 428 ENDIF 429 ! 430 IF( lk_mpp ) THEN 431 zminff=ff(nldi,nldj) 432 zmaxff=ff(nldi,nlej) 433 CALL mpp_min( zminff ) ! min over the global domain 434 CALL mpp_max( zmaxff ) ! max over the global domain 435 IF(lwp) WRITE(numout,*) ' Coriolis parameter varies globally from ', zminff,' to ', zmaxff 436 END IF 437 ! 438 END SELECT 439 440 441 ! Control of domain for symetrical condition 442 ! ------------------------------------------ 443 ! The equator line must be the latitude coordinate axe 444 445 IF( nperio == 2 ) THEN 446 znorme = SQRT( SUM( gphiu(:,2) * gphiu(:,2) ) ) / REAL( jpi ) 447 IF( znorme > 1.e-13 ) CALL ctl_stop( ' ===>>>> : symmetrical condition: rerun with good equator line' ) 448 ENDIF 152 ! 449 153 ! 450 154 IF( nn_timing == 1 ) CALL timing_stop('dom_hgr') … … 453 157 454 158 455 SUBROUTINE hgr_read( ke1e2u_v ) 159 SUBROUTINE hgr_read( plamt , plamu , plamv , plamf , & ! gridpoints position (required) 160 & pphit , pphiu , pphiv , pphif , & 161 & kff , pff_f , pff_t , & ! Coriolis parameter (if not on the sphere) 162 & pe1t , pe1u , pe1v , pe1f , & ! scale factors (required) 163 & pe2t , pe2u , pe2v , pe2f , & 164 & ke1e2u_v , pe1e2u , pe1e2v ) ! u- & v-surfaces (if gridsize reduction in some straits) 456 165 !!--------------------------------------------------------------------- 457 166 !! *** ROUTINE hgr_read *** 458 167 !! 459 !! ** Purpose : Read a coordinate file in NetCDF format using IOM 460 !! 461 !!---------------------------------------------------------------------- 462 USE iom 463 !! 464 INTEGER, INTENT( inout ) :: ke1e2u_v ! fag: e1e2u & e1e2v read in coordinate file (=1) or not (=0) 465 ! 466 INTEGER :: inum ! temporary logical unit 168 !! ** Purpose : Read a mesh_mask file in NetCDF format using IOM 169 !! 170 !!---------------------------------------------------------------------- 171 REAL(wp), DIMENSION(:,:), INTENT(out) :: plamt, plamu, plamv, plamf ! longitude outputs 172 REAL(wp), DIMENSION(:,:), INTENT(out) :: pphit, pphiu, pphiv, pphif ! latitude outputs 173 INTEGER , INTENT(out) :: kff ! =1 Coriolis parameter read here, =0 otherwise 174 REAL(wp), DIMENSION(:,:), INTENT(out) :: pff_f, pff_t ! Coriolis factor at f-point (if found in file) 175 REAL(wp), DIMENSION(:,:), INTENT(out) :: pe1t, pe1u, pe1v, pe1f ! i-scale factors 176 REAL(wp), DIMENSION(:,:), INTENT(out) :: pe2t, pe2u, pe2v, pe2f ! j-scale factors 177 INTEGER , INTENT(out) :: ke1e2u_v ! =1 u- & v-surfaces read here, =0 otherwise 178 REAL(wp), DIMENSION(:,:), INTENT(out) :: pe1e2u, pe1e2v ! u- & v-surfaces (if found in file) 179 ! 180 INTEGER :: inum ! logical unit 467 181 !!---------------------------------------------------------------------- 468 182 ! 469 183 IF(lwp) THEN 470 184 WRITE(numout,*) 471 WRITE(numout,*) 'hgr_read : read the horizontal coordinates '185 WRITE(numout,*) 'hgr_read : read the horizontal coordinates in mesh_mask' 472 186 WRITE(numout,*) '~~~~~~~~ jpiglo = ', jpiglo, ' jpjglo = ', jpjglo, ' jpk = ', jpk 473 187 ENDIF 474 188 ! 475 CALL iom_open( 'coordinates', inum ) 476 ! 477 CALL iom_get( inum, jpdom_data, 'glamt', glamt, lrowattr=ln_use_jattr ) 478 CALL iom_get( inum, jpdom_data, 'glamu', glamu, lrowattr=ln_use_jattr ) 479 CALL iom_get( inum, jpdom_data, 'glamv', glamv, lrowattr=ln_use_jattr ) 480 CALL iom_get( inum, jpdom_data, 'glamf', glamf, lrowattr=ln_use_jattr ) 481 ! 482 CALL iom_get( inum, jpdom_data, 'gphit', gphit, lrowattr=ln_use_jattr ) 483 CALL iom_get( inum, jpdom_data, 'gphiu', gphiu, lrowattr=ln_use_jattr ) 484 CALL iom_get( inum, jpdom_data, 'gphiv', gphiv, lrowattr=ln_use_jattr ) 485 CALL iom_get( inum, jpdom_data, 'gphif', gphif, lrowattr=ln_use_jattr ) 486 ! 487 CALL iom_get( inum, jpdom_data, 'e1t' , e1t , lrowattr=ln_use_jattr ) 488 CALL iom_get( inum, jpdom_data, 'e1u' , e1u , lrowattr=ln_use_jattr ) 489 CALL iom_get( inum, jpdom_data, 'e1v' , e1v , lrowattr=ln_use_jattr ) 490 CALL iom_get( inum, jpdom_data, 'e1f' , e1f , lrowattr=ln_use_jattr ) 491 ! 492 CALL iom_get( inum, jpdom_data, 'e2t' , e2t , lrowattr=ln_use_jattr ) 493 CALL iom_get( inum, jpdom_data, 'e2u' , e2u , lrowattr=ln_use_jattr ) 494 CALL iom_get( inum, jpdom_data, 'e2v' , e2v , lrowattr=ln_use_jattr ) 495 CALL iom_get( inum, jpdom_data, 'e2f' , e2f , lrowattr=ln_use_jattr ) 189 CALL iom_open( cn_domcfg, inum ) 190 ! 191 CALL iom_get( inum, jpdom_data, 'glamt', plamt, lrowattr=ln_use_jattr ) 192 CALL iom_get( inum, jpdom_data, 'glamu', plamu, lrowattr=ln_use_jattr ) 193 CALL iom_get( inum, jpdom_data, 'glamv', plamv, lrowattr=ln_use_jattr ) 194 CALL iom_get( inum, jpdom_data, 'glamf', plamf, lrowattr=ln_use_jattr ) 195 ! 196 CALL iom_get( inum, jpdom_data, 'gphit', pphit, lrowattr=ln_use_jattr ) 197 CALL iom_get( inum, jpdom_data, 'gphiu', pphiu, lrowattr=ln_use_jattr ) 198 CALL iom_get( inum, jpdom_data, 'gphiv', pphiv, lrowattr=ln_use_jattr ) 199 CALL iom_get( inum, jpdom_data, 'gphif', pphif, lrowattr=ln_use_jattr ) 200 ! 201 CALL iom_get( inum, jpdom_data, 'e1t' , pe1t , lrowattr=ln_use_jattr ) 202 CALL iom_get( inum, jpdom_data, 'e1u' , pe1u , lrowattr=ln_use_jattr ) 203 CALL iom_get( inum, jpdom_data, 'e1v' , pe1v , lrowattr=ln_use_jattr ) 204 CALL iom_get( inum, jpdom_data, 'e1f' , pe1f , lrowattr=ln_use_jattr ) 205 ! 206 CALL iom_get( inum, jpdom_data, 'e2t' , pe2t , lrowattr=ln_use_jattr ) 207 CALL iom_get( inum, jpdom_data, 'e2u' , pe2u , lrowattr=ln_use_jattr ) 208 CALL iom_get( inum, jpdom_data, 'e2v' , pe2v , lrowattr=ln_use_jattr ) 209 CALL iom_get( inum, jpdom_data, 'e2f' , pe2f , lrowattr=ln_use_jattr ) 210 ! 211 IF( iom_varid( inum, 'ff_f', ldstop = .FALSE. ) > 0 .AND. & 212 & iom_varid( inum, 'ff_t', ldstop = .FALSE. ) > 0 ) THEN 213 IF(lwp) WRITE(numout,*) ' Coriolis factor at f- and t-points read in ', TRIM( cn_domcfg ), ' file' 214 CALL iom_get( inum, jpdom_data, 'ff_f' , pff_f , lrowattr=ln_use_jattr ) 215 CALL iom_get( inum, jpdom_data, 'ff_t' , pff_t , lrowattr=ln_use_jattr ) 216 kff = 1 217 ELSE 218 kff = 0 219 ENDIF 496 220 ! 497 221 IF( iom_varid( inum, 'e1e2u', ldstop = .FALSE. ) > 0 ) THEN 498 IF(lwp) WRITE(numout,*) ' hgr_read : e1e2u & e1e2v read in coordinatesfile'499 CALL iom_get( inum, jpdom_data, 'e1e2u' , e1e2u , lrowattr=ln_use_jattr )500 CALL iom_get( inum, jpdom_data, 'e1e2v' , e1e2v , lrowattr=ln_use_jattr )222 IF(lwp) WRITE(numout,*) ' e1e2u & e1e2v read in ', TRIM( cn_domcfg ), ' file' 223 CALL iom_get( inum, jpdom_data, 'e1e2u' , pe1e2u , lrowattr=ln_use_jattr ) 224 CALL iom_get( inum, jpdom_data, 'e1e2v' , pe1e2v , lrowattr=ln_use_jattr ) 501 225 ke1e2u_v = 1 502 226 ELSE … … 505 229 ! 506 230 CALL iom_close( inum ) 507 508 231 ! 232 END SUBROUTINE hgr_read 509 233 510 234 !!====================================================================== -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/dommsk.F90
r7412 r7421 9 9 !! - ! 1996-05 (G. Madec) mask computed from tmask 10 10 !! 8.0 ! 1997-02 (G. Madec) mesh information put in domhgr.F 11 !! 8.1 ! 1997-07 (G. Madec) modification of mbathyand fmask11 !! 8.1 ! 1997-07 (G. Madec) modification of kbat and fmask 12 12 !! - ! 1998-05 (G. Roullet) free surface 13 13 !! 8.2 ! 2000-03 (G. Madec) no slip accurate … … 17 17 !! 3.2 ! 2009-07 (R. Benshila) Suppression of rigid-lid option 18 18 !! 3.6 ! 2015-05 (P. Mathiot) ISF: add wmask,wumask and wvmask 19 !!---------------------------------------------------------------------- 20 21 !!---------------------------------------------------------------------- 22 !! dom_msk : compute land/ocean mask 23 !!---------------------------------------------------------------------- 24 USE oce ! ocean dynamics and tracers 25 USE dom_oce ! ocean space and time domain 19 !! 4.0 ! 2016-06 (G. Madec, S. Flavoni) domain configuration / user defined interface 20 !!---------------------------------------------------------------------- 21 22 !!---------------------------------------------------------------------- 23 !! dom_msk : compute land/ocean mask 24 !!---------------------------------------------------------------------- 25 USE oce ! ocean dynamics and tracers 26 USE dom_oce ! ocean space and time domain 27 USE usrdef_fmask ! user defined fmask 26 28 USE bdy_oce 27 USE in_out_manager ! I/O manager 28 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 USE lib_mpp ! 30 USE iom 31 USE wrk_nemo ! Memory allocation 32 USE timing ! Timing 29 USE in_out_manager ! I/O manager 30 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 31 USE lib_mpp ! Massively Parallel Processing library 32 USE wrk_nemo ! Memory allocation 33 USE timing ! Timing 33 34 34 35 IMPLICIT NONE … … 51 52 CONTAINS 52 53 53 SUBROUTINE dom_msk 54 SUBROUTINE dom_msk( k_top, k_bot ) 54 55 !!--------------------------------------------------------------------- 55 56 !! *** ROUTINE dom_msk *** … … 58 59 !! zontal velocity points (u & v), vorticity points (f) points. 59 60 !! 60 !! ** Method : The ocean/land mask is computed from the basin bathy- 61 !! metry in level (mbathy) which is defined or read in dommba. 62 !! mbathy equals 0 over continental T-point 63 !! and the number of ocean level over the ocean. 64 !! 65 !! At a given position (ji,jj,jk) the ocean/land mask is given by: 66 !! t-point : 0. IF mbathy( ji ,jj) =< 0 67 !! 1. IF mbathy( ji ,jj) >= jk 68 !! u-point : 0. IF mbathy( ji ,jj) or mbathy(ji+1, jj ) =< 0 69 !! 1. IF mbathy( ji ,jj) and mbathy(ji+1, jj ) >= jk. 70 !! v-point : 0. IF mbathy( ji ,jj) or mbathy( ji ,jj+1) =< 0 71 !! 1. IF mbathy( ji ,jj) and mbathy( ji ,jj+1) >= jk. 72 !! f-point : 0. IF mbathy( ji ,jj) or mbathy( ji ,jj+1) 73 !! or mbathy(ji+1,jj) or mbathy(ji+1,jj+1) =< 0 74 !! 1. IF mbathy( ji ,jj) and mbathy( ji ,jj+1) 75 !! and mbathy(ji+1,jj) and mbathy(ji+1,jj+1) >= jk. 76 !! tmask_i : interior ocean mask at t-point, i.e. excluding duplicated 77 !! rows/lines due to cyclic or North Fold boundaries as well 78 !! as MPP halos. 79 !! 80 !! The lateral friction is set through the value of fmask along 81 !! the coast and topography. This value is defined by rn_shlat, a 82 !! namelist parameter: 61 !! ** Method : The ocean/land mask at t-point is deduced from ko_top 62 !! and ko_bot, the indices of the fist and last ocean t-levels which 63 !! are either defined in usrdef_zgr or read in zgr_read. 64 !! The velocity masks (umask, vmask, wmask, wumask, wvmask) 65 !! are deduced from a product of the two neighboring tmask. 66 !! The vorticity mask (fmask) is deduced from tmask taking 67 !! into account the choice of lateral boundary condition (rn_shlat) : 83 68 !! rn_shlat = 0, free slip (no shear along the coast) 84 69 !! rn_shlat = 2, no slip (specified zero velocity at the coast) … … 86 71 !! 2 < rn_shlat, strong slip | in the lateral boundary layer 87 72 !! 88 !! N.B. If nperio not equal to 0, the land/ocean mask arrays89 !! are defined with the proper value at lateral domain boundaries.90 !! 91 !! In case of open boundaries (ln_bdy=T):92 !! - tmask is set to 1 on the points to be computed bay the open93 !! boundaries routines.94 !! 95 !! ** Action : tmask : land/ocean mask at t-point(=0. or 1.)96 !! umask : land/ocean mask at u-point (=0. or 1.)97 !! vmask : land/ocean mask at v-point (=0. or 1.)98 !! fmask : land/ocean mask at f-point (=0. or 1.)99 !! =rn_shlat along lateral boundaries100 !! tmask_i : interiorocean mask73 !! tmask_i : interior ocean mask at t-point, i.e. excluding duplicated 74 !! rows/lines due to cyclic or North Fold boundaries as well 75 !! as MPP halos. 76 !! tmask_h : halo mask at t-point, i.e. excluding duplicated rows/lines 77 !! due to cyclic or North Fold boundaries as well as MPP halos. 78 !! 79 !! ** Action : tmask, umask, vmask, wmask, wumask, wvmask : land/ocean mask 80 !! at t-, u-, v- w, wu-, and wv-points (=0. or 1.) 81 !! fmask : land/ocean mask at f-point (=0., or =1., or 82 !! =rn_shlat along lateral boundaries) 83 !! tmask_i : interior ocean mask 84 !! tmask_h : halo mask 85 !! ssmask , ssumask, ssvmask, ssfmask : 2D ocean mask 101 86 !!---------------------------------------------------------------------- 102 INTEGER :: ji, jj, jk ! dummy loop indices 103 INTEGER :: iif, iil, ii0, ii1, ii ! local integers 104 INTEGER :: ijf, ijl, ij0, ij1 ! - - 87 INTEGER, DIMENSION(:,:), INTENT(in) :: k_top, k_bot ! first and last ocean level 88 ! 89 INTEGER :: ji, jj, jk ! dummy loop indices 90 INTEGER :: iif, iil ! local integers 91 INTEGER :: ijf, ijl ! - - 92 INTEGER :: iktop, ikbot ! - - 105 93 INTEGER :: ios, inum 106 INTEGER :: isrow ! index for ORCA1 starting row 107 INTEGER , POINTER, DIMENSION(:,:) :: imsk 108 REAL(wp), POINTER, DIMENSION(:,:) :: zwf 94 REAL(wp), POINTER, DIMENSION(:,:) :: zwf ! 2D workspace 109 95 !! 110 96 NAMELIST/namlbc/ rn_shlat, ln_vorlat … … 119 105 ! 120 106 IF( nn_timing == 1 ) CALL timing_start('dom_msk') 121 !122 CALL wrk_alloc( jpi, jpj, imsk )123 CALL wrk_alloc( jpi, jpj, zwf )124 107 ! 125 108 REWIND( numnam_ref ) ! Namelist namlbc in reference namelist : Lateral momentum boundary condition … … 150 133 ENDIF 151 134 152 ! 1. Ocean/land mask at t-point (computed from mbathy) 153 ! -----------------------------154 ! N.B. tmask has already the right boundary conditions since mbathy is ok135 136 ! Ocean/land mask at t-point (computed from ko_top and ko_bot) 137 ! ---------------------------- 155 138 ! 156 139 tmask(:,:,:) = 0._wp 157 DO jk = 1, jpk 158 DO jj = 1, jpj 159 DO ji = 1, jpi 160 IF( REAL( mbathy(ji,jj) - jk, wp ) + 0.1_wp >= 0._wp ) tmask(ji,jj,jk) = 1._wp 161 END DO 140 DO jj = 1, jpj 141 DO ji = 1, jpi 142 iktop = k_top(ji,jj) 143 ikbot = k_bot(ji,jj) 144 IF( iktop /= 0 ) THEN ! water in the column 145 tmask(ji,jj,iktop:ikbot ) = 1._wp 146 ENDIF 162 147 END DO 163 148 END DO 149 !SF add here lbc_lnk: bug not still understood : cause now domain configuration is read ! 150 !!gm I don't understand why... 151 CALL lbc_lnk( tmask , 'T', 1._wp ) ! Lateral boundary conditions 164 152 165 REWIND( numnam_ref ) ! Namelist nambdy in reference namelist :Unstructured open boundaries 166 READ ( numnam_ref, nambdy, IOSTAT = ios, ERR = 903) 167 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in reference namelist', lwp ) 168 169 REWIND( numnam_cfg ) ! Namelist nambdy in configuration namelist :Unstructured open boundaries 170 READ ( numnam_cfg, nambdy, IOSTAT = ios, ERR = 904 ) 171 904 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in configuration namelist', lwp ) 172 IF(lwm) WRITE ( numond, nambdy ) 173 174 IF( ln_bdy .AND. ln_mask_file ) THEN ! correct for bdy mask 175 CALL iom_open( cn_mask_file, inum ) 176 CALL iom_get ( inum, jpdom_data, 'bdy_msk', bdytmask(:,:) ) 177 CALL iom_close( inum ) 178 179 ! Mask corrections 180 ! ---------------- 181 DO jk = 1, jpkm1 182 DO jj = 1, jpj 183 DO ji = 1, jpi 184 tmask(ji,jj,jk) = tmask(ji,jj,jk) * bdytmask(ji,jj) 185 END DO 186 END DO 187 END DO 188 ENDIF 189 190 ! (ISF) define barotropic mask and mask the ice shelf point 191 ssmask(:,:)=tmask(:,:,1) ! at this stage ice shelf is not masked 192 193 DO jk = 1, jpk 194 DO jj = 1, jpj 195 DO ji = 1, jpi 196 IF( REAL( misfdep(ji,jj) - jk, wp ) - 0.1_wp >= 0._wp ) THEN 197 tmask(ji,jj,jk) = 0._wp 198 END IF 199 END DO 200 END DO 201 END DO 202 203 ! Interior domain mask (used for global sum) 204 ! -------------------- 205 tmask_i(:,:) = ssmask(:,:) ! (ISH) tmask_i = 1 even on the ice shelf 206 207 tmask_h(:,:) = 1._wp ! 0 on the halo and 1 elsewhere 208 iif = jpreci ! ??? 209 iil = nlci - jpreci + 1 210 ijf = jprecj ! ??? 211 ijl = nlcj - jprecj + 1 212 213 tmask_h( 1 :iif, : ) = 0._wp ! first columns 214 tmask_h(iil:jpi, : ) = 0._wp ! last columns (including mpp extra columns) 215 tmask_h( : , 1 :ijf) = 0._wp ! first rows 216 tmask_h( : ,ijl:jpj) = 0._wp ! last rows (including mpp extra rows) 217 218 ! north fold mask 219 ! --------------- 220 tpol(1:jpiglo) = 1._wp 221 fpol(1:jpiglo) = 1._wp 222 IF( jperio == 3 .OR. jperio == 4 ) THEN ! T-point pivot 223 tpol(jpiglo/2+1:jpiglo) = 0._wp 224 fpol( 1 :jpiglo) = 0._wp 225 IF( mjg(nlej) == jpjglo ) THEN ! only half of the nlcj-1 row 226 DO ji = iif+1, iil-1 227 tmask_h(ji,nlej-1) = tmask_h(ji,nlej-1) * tpol(mig(ji)) 228 END DO 229 ENDIF 230 ENDIF 231 232 tmask_i(:,:) = tmask_i(:,:) * tmask_h(:,:) 233 234 IF( jperio == 5 .OR. jperio == 6 ) THEN ! F-point pivot 235 tpol( 1 :jpiglo) = 0._wp 236 fpol(jpiglo/2+1:jpiglo) = 0._wp 237 ENDIF 238 239 ! 2. Ocean/land mask at u-, v-, and z-points (computed from tmask) 240 ! ------------------------------------------- 153 ! Ocean/land mask at u-, v-, and f-points (computed from tmask) 154 ! ---------------------------------------- 155 ! NB: at this point, fmask is designed for free slip lateral boundary condition 241 156 DO jk = 1, jpk 242 157 DO jj = 1, jpjm1 … … 251 166 END DO 252 167 END DO 253 ! (ISF) MIN(1,SUM(umask)) is here to check if you have effectively at least 1 wet cell at u point254 DO jj = 1, jpjm1255 DO ji = 1, fs_jpim1 ! vector loop256 ssumask(ji,jj) = ssmask(ji,jj) * ssmask(ji+1,jj ) * MIN(1._wp,SUM(umask(ji,jj,:)))257 ssvmask(ji,jj) = ssmask(ji,jj) * ssmask(ji ,jj+1) * MIN(1._wp,SUM(vmask(ji,jj,:)))258 END DO259 DO ji = 1, jpim1 ! NO vector opt.260 ssfmask(ji,jj) = ssmask(ji,jj ) * ssmask(ji+1,jj ) &261 & * ssmask(ji,jj+1) * ssmask(ji+1,jj+1) * MIN(1._wp,SUM(fmask(ji,jj,:)))262 END DO263 END DO264 168 CALL lbc_lnk( umask , 'U', 1._wp ) ! Lateral boundary conditions 265 169 CALL lbc_lnk( vmask , 'V', 1._wp ) 266 170 CALL lbc_lnk( fmask , 'F', 1._wp ) 267 CALL lbc_lnk( ssumask, 'U', 1._wp ) ! Lateral boundary conditions 268 CALL lbc_lnk( ssvmask, 'V', 1._wp ) 269 CALL lbc_lnk( ssfmask, 'F', 1._wp ) 270 271 ! 3. Ocean/land mask at wu-, wv- and w points 272 !---------------------------------------------- 171 172 173 ! Ocean/land mask at wu-, wv- and w points (computed from tmask) 174 !----------------------------------------- 273 175 wmask (:,:,1) = tmask(:,:,1) ! surface 274 176 wumask(:,:,1) = umask(:,:,1) … … 280 182 END DO 281 183 184 185 ! Ocean/land column mask at t-, u-, and v-points (i.e. at least 1 wet cell in the vertical) 186 ! ---------------------------------------------- 187 ssmask (:,:) = MAXVAL( tmask(:,:,:), DIM=3 ) 188 ssumask(:,:) = MAXVAL( umask(:,:,:), DIM=3 ) 189 ssvmask(:,:) = MAXVAL( vmask(:,:,:), DIM=3 ) 190 191 192 ! Interior domain mask (used for global sum) 193 ! -------------------- 194 ! 195 iif = jpreci ; iil = nlci - jpreci + 1 196 ijf = jprecj ; ijl = nlcj - jprecj + 1 197 ! 198 ! ! halo mask : 0 on the halo and 1 elsewhere 199 tmask_h(:,:) = 1._wp 200 tmask_h( 1 :iif, : ) = 0._wp ! first columns 201 tmask_h(iil:jpi, : ) = 0._wp ! last columns (including mpp extra columns) 202 tmask_h( : , 1 :ijf) = 0._wp ! first rows 203 tmask_h( : ,ijl:jpj) = 0._wp ! last rows (including mpp extra rows) 204 ! 205 ! ! north fold mask 206 tpol(1:jpiglo) = 1._wp 207 fpol(1:jpiglo) = 1._wp 208 IF( jperio == 3 .OR. jperio == 4 ) THEN ! T-point pivot 209 tpol(jpiglo/2+1:jpiglo) = 0._wp 210 fpol( 1 :jpiglo) = 0._wp 211 IF( mjg(nlej) == jpjglo ) THEN ! only half of the nlcj-1 row for tmask_h 212 DO ji = iif+1, iil-1 213 tmask_h(ji,nlej-1) = tmask_h(ji,nlej-1) * tpol(mig(ji)) 214 END DO 215 ENDIF 216 ENDIF 217 ! 218 IF( jperio == 5 .OR. jperio == 6 ) THEN ! F-point pivot 219 tpol( 1 :jpiglo) = 0._wp 220 fpol(jpiglo/2+1:jpiglo) = 0._wp 221 ENDIF 222 ! 223 ! ! interior mask : 2D ocean mask x halo mask 224 tmask_i(:,:) = ssmask(:,:) * tmask_h(:,:) 225 226 282 227 ! Lateral boundary conditions on velocity (modify fmask) 283 ! --------------------------------------- 284 DO jk = 1, jpk 285 zwf(:,:) = fmask(:,:,jk) 286 DO jj = 2, jpjm1 287 DO ji = fs_2, fs_jpim1 ! vector opt. 288 IF( fmask(ji,jj,jk) == 0._wp ) THEN 289 fmask(ji,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,jj), zwf(ji,jj+1), & 290 & zwf(ji-1,jj), zwf(ji,jj-1) ) ) 228 ! --------------------------------------- 229 IF( rn_shlat /= 0 ) THEN ! Not free-slip lateral boundary condition 230 ! 231 CALL wrk_alloc( jpi,jpj, zwf ) 232 ! 233 DO jk = 1, jpk 234 zwf(:,:) = fmask(:,:,jk) 235 DO jj = 2, jpjm1 236 DO ji = fs_2, fs_jpim1 ! vector opt. 237 IF( fmask(ji,jj,jk) == 0._wp ) THEN 238 fmask(ji,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,jj), zwf(ji,jj+1), & 239 & zwf(ji-1,jj), zwf(ji,jj-1) ) ) 240 ENDIF 241 END DO 242 END DO 243 DO jj = 2, jpjm1 244 IF( fmask(1,jj,jk) == 0._wp ) THEN 245 fmask(1 ,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(2,jj), zwf(1,jj+1), zwf(1,jj-1) ) ) 246 ENDIF 247 IF( fmask(jpi,jj,jk) == 0._wp ) THEN 248 fmask(jpi,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(jpi,jj+1), zwf(jpim1,jj), zwf(jpi,jj-1) ) ) 249 ENDIF 250 END DO 251 DO ji = 2, jpim1 252 IF( fmask(ji,1,jk) == 0._wp ) THEN 253 fmask(ji, 1 ,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,1), zwf(ji,2), zwf(ji-1,1) ) ) 254 ENDIF 255 IF( fmask(ji,jpj,jk) == 0._wp ) THEN 256 fmask(ji,jpj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,jpj), zwf(ji-1,jpj), zwf(ji,jpjm1) ) ) 291 257 ENDIF 292 258 END DO 293 259 END DO 294 DO jj = 2, jpjm1 295 IF( fmask(1,jj,jk) == 0._wp ) THEN 296 fmask(1 ,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(2,jj), zwf(1,jj+1), zwf(1,jj-1) ) ) 297 ENDIF 298 IF( fmask(jpi,jj,jk) == 0._wp ) THEN 299 fmask(jpi,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(jpi,jj+1), zwf(jpim1,jj), zwf(jpi,jj-1) ) ) 300 ENDIF 301 END DO 302 DO ji = 2, jpim1 303 IF( fmask(ji,1,jk) == 0._wp ) THEN 304 fmask(ji, 1 ,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,1), zwf(ji,2), zwf(ji-1,1) ) ) 305 ENDIF 306 IF( fmask(ji,jpj,jk) == 0._wp ) THEN 307 fmask(ji,jpj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,jpj), zwf(ji-1,jpj), zwf(ji,jpjm1) ) ) 308 ENDIF 309 END DO 310 END DO 311 ! 312 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN ! ORCA_R2 configuration 313 ! ! Increased lateral friction near of some straits 314 ! ! Gibraltar strait : partial slip (fmask=0.5) 315 ij0 = 101 ; ij1 = 101 316 ii0 = 139 ; ii1 = 140 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 0.5_wp 317 ij0 = 102 ; ij1 = 102 318 ii0 = 139 ; ii1 = 140 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 0.5_wp 319 ! 320 ! ! Bab el Mandeb : partial slip (fmask=1) 321 ij0 = 87 ; ij1 = 88 322 ii0 = 160 ; ii1 = 160 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 1._wp 323 ij0 = 88 ; ij1 = 88 324 ii0 = 159 ; ii1 = 159 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 1._wp 325 ! 326 ! ! Danish straits : strong slip (fmask > 2) 327 ! We keep this as an example but it is instable in this case 328 ! ij0 = 115 ; ij1 = 115 329 ! ii0 = 145 ; ii1 = 146 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp 330 ! ij0 = 116 ; ij1 = 116 331 ! ii0 = 145 ; ii1 = 146 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp 332 ! 333 ENDIF 334 ! 335 IF( cp_cfg == "orca" .AND. jp_cfg == 1 ) THEN ! ORCA R1 configuration 336 ! ! Increased lateral friction near of some straits 337 ! This dirty section will be suppressed by simplification process: 338 ! all this will come back in input files 339 ! Currently these hard-wired indices relate to configuration with 340 ! extend grid (jpjglo=332) 341 ! 342 isrow = 332 - jpjglo 343 ! 344 IF(lwp) WRITE(numout,*) 345 IF(lwp) WRITE(numout,*) ' orca_r1: increase friction near the following straits : ' 346 IF(lwp) WRITE(numout,*) ' Gibraltar ' 347 ii0 = 282 ; ii1 = 283 ! Gibraltar Strait 348 ij0 = 241 - isrow ; ij1 = 241 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 349 350 IF(lwp) WRITE(numout,*) ' Bhosporus ' 351 ii0 = 314 ; ii1 = 315 ! Bhosporus Strait 352 ij0 = 248 - isrow ; ij1 = 248 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 353 354 IF(lwp) WRITE(numout,*) ' Makassar (Top) ' 355 ii0 = 48 ; ii1 = 48 ! Makassar Strait (Top) 356 ij0 = 189 - isrow ; ij1 = 190 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp 357 358 IF(lwp) WRITE(numout,*) ' Lombok ' 359 ii0 = 44 ; ii1 = 44 ! Lombok Strait 360 ij0 = 164 - isrow ; ij1 = 165 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 361 362 IF(lwp) WRITE(numout,*) ' Ombai ' 363 ii0 = 53 ; ii1 = 53 ! Ombai Strait 364 ij0 = 164 - isrow ; ij1 = 165 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 365 366 IF(lwp) WRITE(numout,*) ' Timor Passage ' 367 ii0 = 56 ; ii1 = 56 ! Timor Passage 368 ij0 = 164 - isrow ; ij1 = 165 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 369 370 IF(lwp) WRITE(numout,*) ' West Halmahera ' 371 ii0 = 58 ; ii1 = 58 ! West Halmahera Strait 372 ij0 = 181 - isrow ; ij1 = 182 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp 373 374 IF(lwp) WRITE(numout,*) ' East Halmahera ' 375 ii0 = 55 ; ii1 = 55 ! East Halmahera Strait 376 ij0 = 181 - isrow ; ij1 = 182 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp 377 ! 378 ENDIF 379 ! 380 CALL lbc_lnk( fmask, 'F', 1._wp ) ! Lateral boundary conditions on fmask 381 ! 382 ! CAUTION : The fmask may be further modified in dyn_vor_init ( dynvor.F90 ) 383 ! 384 CALL wrk_dealloc( jpi, jpj, imsk ) 385 CALL wrk_dealloc( jpi, jpj, zwf ) 260 ! 261 CALL wrk_dealloc( jpi,jpj, zwf ) 262 ! 263 CALL lbc_lnk( fmask, 'F', 1._wp ) ! Lateral boundary conditions on fmask 264 ! 265 ! CAUTION : The fmask may be further modified in dyn_vor_init ( dynvor.F90 ) depending on ln_vorlat 266 ! 267 ENDIF 268 269 ! User defined alteration of fmask (use to reduce ocean transport in specified straits) 270 ! -------------------------------- 271 ! 272 CALL usr_def_fmask( cn_cfg, nn_cfg, fmask ) 273 ! 386 274 ! 387 275 IF( nn_timing == 1 ) CALL timing_stop('dom_msk') -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/domngb.F90
r6140 r7421 62 62 END SELECT 63 63 64 IF (jphgr_msh /= 2 .AND. jphgr_msh /= 3) THEN 65 zlon = MOD( plon + 720., 360. ) ! plon between 0 and 360 66 zglam(:,:) = MOD( zglam(:,:) + 720., 360. ) ! glam between 0 and 360 67 IF( zlon > 270. ) zlon = zlon - 360. ! zlon between -90 and 270 68 IF( zlon < 90. ) WHERE( zglam(:,:) > 180. ) zglam(:,:) = zglam(:,:) - 360. ! glam between -180 and 180 69 zglam(:,:) = zglam(:,:) - zlon 70 ELSE 71 zglam(:,:) = zglam(:,:) - plon 72 END IF 64 zlon = MOD( plon + 720., 360. ) ! plon between 0 and 360 65 zglam(:,:) = MOD( zglam(:,:) + 720., 360. ) ! glam between 0 and 360 66 IF( zlon > 270. ) zlon = zlon - 360. ! zlon between -90 and 270 67 IF( zlon < 90. ) WHERE( zglam(:,:) > 180. ) zglam(:,:) = zglam(:,:) - 360. ! glam between -180 and 180 68 zglam(:,:) = zglam(:,:) - zlon 73 69 74 70 zgphi(:,:) = zgphi(:,:) - plat -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90
r7412 r7421 232 232 END DO 233 233 END DO 234 IF( c p_cfg == "orca" .AND. jp_cfg == 3 ) THEN ! ORCA2: Suppress ztilde in the Foxe Basin for ORCA2234 IF( cn_cfg == "orca" .AND. nn_cfg == 3 ) THEN ! ORCA2: Suppress ztilde in the Foxe Basin for ORCA2 235 235 ii0 = 103 ; ii1 = 111 236 236 ij0 = 128 ; ij1 = 135 ; … … 896 896 e3t_n(ji,jj,:) = 0.5_wp * rn_wdmin1 897 897 e3t_a(ji,jj,:) = 0.5_wp * rn_wdmin1 898 sshb(ji,jj) = rn_wdmin1 - bathy(ji,jj)899 sshn(ji,jj) = rn_wdmin1 - bathy(ji,jj)900 ssha(ji,jj) = rn_wdmin1 - bathy(ji,jj)898 sshb(ji,jj) = rn_wdmin1 - ht_0(ji,jj) !!gm I don't understand that ! 899 sshn(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 900 ssha(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 901 901 ENDIF 902 902 ENDDO … … 912 912 913 913 IF( ln_vvl_ztilde .OR. ln_vvl_layer) THEN 914 tilde_e3t_b(:,:,:) = 0. 0_wp915 tilde_e3t_n(:,:,:) = 0. 0_wp916 IF( ln_vvl_ztilde ) hdiv_lf(:,:,:) = 0. 0_wp914 tilde_e3t_b(:,:,:) = 0._wp 915 tilde_e3t_n(:,:,:) = 0._wp 916 IF( ln_vvl_ztilde ) hdiv_lf(:,:,:) = 0._wp 917 917 END IF 918 918 ENDIF -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/domwri.F90
r6689 r7421 8 8 !! NEMO 1.0 ! 2002-08 (G. Madec) F90 and several file 9 9 !! 3.0 ! 2008-01 (S. Masson) add dom_uniq 10 !! 4.0 ! 2016-01 (G. Madec) simplified mesh_mask.nc file 10 11 !!---------------------------------------------------------------------- 11 12 … … 13 14 !! dom_wri : create and write mesh and mask file(s) 14 15 !! dom_uniq : identify unique point of a grid (TUVF) 16 !! dom_stiff : diagnose maximum grid stiffness/hydrostatic consistency (s-coordinate) 15 17 !!---------------------------------------------------------------------- 16 18 USE dom_oce ! ocean space and time domain 19 USE phycst , ONLY : rsmall 20 ! 17 21 USE in_out_manager ! I/O manager 18 22 USE iom ! I/O library … … 26 30 27 31 PUBLIC dom_wri ! routine called by inidom.F90 28 PUBLIC dom_wri_coordinate ! routine called by domhgr.F90 32 PUBLIC dom_stiff ! routine called by inidom.F90 33 29 34 !! * Substitutions 30 35 # include "vectopt_loop_substitute.h90" 31 36 !!---------------------------------------------------------------------- 32 !! NEMO/OPA 3.3 , NEMO Consortium (2010)37 !! NEMO/OPA 4.0 , NEMO Consortium (2016) 33 38 !! $Id$ 34 39 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 35 40 !!---------------------------------------------------------------------- 36 41 CONTAINS 37 38 SUBROUTINE dom_wri_coordinate39 !!----------------------------------------------------------------------40 !! *** ROUTINE dom_wri_coordinate ***41 !!42 !! ** Purpose : Create the NetCDF file which contains all the43 !! standard coordinate information plus the surface,44 !! e1e2u and e1e2v. By doing so, those surface will45 !! not be changed by the reduction of e1u or e2v scale46 !! factors in some straits.47 !! NB: call just after the read of standard coordinate48 !! and the reduction of scale factors in some straits49 !!50 !! ** output file : coordinate_e1e2u_v.nc51 !!----------------------------------------------------------------------52 INTEGER :: inum0 ! temprary units for 'coordinate_e1e2u_v.nc' file53 CHARACTER(len=21) :: clnam0 ! filename (mesh and mask informations)54 ! ! workspaces55 REAL(wp), POINTER, DIMENSION(:,: ) :: zprt, zprw56 REAL(wp), POINTER, DIMENSION(:,:,:) :: zdepu, zdepv57 !!----------------------------------------------------------------------58 !59 IF( nn_timing == 1 ) CALL timing_start('dom_wri_coordinate')60 !61 IF(lwp) WRITE(numout,*)62 IF(lwp) WRITE(numout,*) 'dom_wri_coordinate : create NetCDF coordinate file'63 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~~'64 65 clnam0 = 'coordinate_e1e2u_v' ! filename (mesh and mask informations)66 67 ! create 'coordinate_e1e2u_v.nc' file68 ! ============================69 !70 CALL iom_open( TRIM(clnam0), inum0, ldwrt = .TRUE., kiolib = jprstlib )71 !72 ! ! horizontal mesh (inum3)73 CALL iom_rstput( 0, 0, inum0, 'glamt', glamt, ktype = jp_r8 ) ! ! latitude74 CALL iom_rstput( 0, 0, inum0, 'glamu', glamu, ktype = jp_r8 )75 CALL iom_rstput( 0, 0, inum0, 'glamv', glamv, ktype = jp_r8 )76 CALL iom_rstput( 0, 0, inum0, 'glamf', glamf, ktype = jp_r8 )77 78 CALL iom_rstput( 0, 0, inum0, 'gphit', gphit, ktype = jp_r8 ) ! ! longitude79 CALL iom_rstput( 0, 0, inum0, 'gphiu', gphiu, ktype = jp_r8 )80 CALL iom_rstput( 0, 0, inum0, 'gphiv', gphiv, ktype = jp_r8 )81 CALL iom_rstput( 0, 0, inum0, 'gphif', gphif, ktype = jp_r8 )82 83 CALL iom_rstput( 0, 0, inum0, 'e1t', e1t, ktype = jp_r8 ) ! ! e1 scale factors84 CALL iom_rstput( 0, 0, inum0, 'e1u', e1u, ktype = jp_r8 )85 CALL iom_rstput( 0, 0, inum0, 'e1v', e1v, ktype = jp_r8 )86 CALL iom_rstput( 0, 0, inum0, 'e1f', e1f, ktype = jp_r8 )87 88 CALL iom_rstput( 0, 0, inum0, 'e2t', e2t, ktype = jp_r8 ) ! ! e2 scale factors89 CALL iom_rstput( 0, 0, inum0, 'e2u', e2u, ktype = jp_r8 )90 CALL iom_rstput( 0, 0, inum0, 'e2v', e2v, ktype = jp_r8 )91 CALL iom_rstput( 0, 0, inum0, 'e2f', e2f, ktype = jp_r8 )92 93 CALL iom_rstput( 0, 0, inum0, 'e1e2u', e1e2u, ktype = jp_r8 )94 CALL iom_rstput( 0, 0, inum0, 'e1e2v', e1e2v, ktype = jp_r8 )95 96 CALL iom_close( inum0 )97 !98 IF( nn_timing == 1 ) CALL timing_stop('dom_wri_coordinate')99 !100 END SUBROUTINE dom_wri_coordinate101 102 42 103 43 SUBROUTINE dom_wri … … 113 53 !! domhgr, domzgr, and dommsk. Note: the file contain depends on 114 54 !! the vertical coord. used (z-coord, partial steps, s-coord) 115 !! MOD(n msh, 3) = 1 : 'mesh_mask.nc' file55 !! MOD(nn_msh, 3) = 1 : 'mesh_mask.nc' file 116 56 !! = 2 : 'mesh.nc' and mask.nc' files 117 57 !! = 0 : 'mesh_hgr.nc', 'mesh_zgr.nc' and … … 120 60 !! vertical coordinate. 121 61 !! 122 !! if n msh <= 3: write full 3D arrays for e3[tuvw] and gdep[tuvw]123 !! if 3 < n msh <= 6: write full 3D arrays for e3[tuvw] and 2D arrays62 !! if nn_msh <= 3: write full 3D arrays for e3[tuvw] and gdep[tuvw] 63 !! if 3 < nn_msh <= 6: write full 3D arrays for e3[tuvw] and 2D arrays 124 64 !! corresponding to the depth of the bottom t- and w-points 125 !! if 6 < n msh <= 9: write 2D arrays corresponding to the depth and the65 !! if 6 < nn_msh <= 9: write 2D arrays corresponding to the depth and the 126 66 !! thickness (e3[tw]_ps) of the bottom points 127 67 !! … … 129 69 !! masks, depth and vertical scale factors 130 70 !!---------------------------------------------------------------------- 131 !! 132 INTEGER :: inum0 ! temprary units for 'mesh_mask.nc' file 133 INTEGER :: inum1 ! temprary units for 'mesh.nc' file 134 INTEGER :: inum2 ! temprary units for 'mask.nc' file 135 INTEGER :: inum3 ! temprary units for 'mesh_hgr.nc' file 136 INTEGER :: inum4 ! temprary units for 'mesh_zgr.nc' file 137 CHARACTER(len=21) :: clnam0 ! filename (mesh and mask informations) 138 CHARACTER(len=21) :: clnam1 ! filename (mesh informations) 139 CHARACTER(len=21) :: clnam2 ! filename (mask informations) 140 CHARACTER(len=21) :: clnam3 ! filename (horizontal mesh informations) 141 CHARACTER(len=21) :: clnam4 ! filename (vertical mesh informations) 71 INTEGER :: inum ! temprary units for 'mesh_mask.nc' file 72 CHARACTER(len=21) :: clnam ! filename (mesh and mask informations) 142 73 INTEGER :: ji, jj, jk ! dummy loop indices 143 ! ! workspaces 144 REAL(wp), POINTER, DIMENSION(:,: ) :: zprt, zprw 145 REAL(wp), POINTER, DIMENSION(:,:,:) :: zdepu, zdepv 74 INTEGER :: izco, izps, isco, icav 75 ! 76 REAL(wp), POINTER, DIMENSION(:,:) :: zprt, zprw ! 2D workspace 77 REAL(wp), POINTER, DIMENSION(:,:,:) :: zdepu, zdepv ! 3D workspace 146 78 !!---------------------------------------------------------------------- 147 79 ! 148 80 IF( nn_timing == 1 ) CALL timing_start('dom_wri') 149 81 ! 150 CALL wrk_alloc( jpi, jpj, zprt, zprw)151 CALL wrk_alloc( jpi, jpj, jpk,zdepu, zdepv )82 CALL wrk_alloc( jpi,jpj, zprt , zprw ) 83 CALL wrk_alloc( jpi,jpj,jpk, zdepu, zdepv ) 152 84 ! 153 85 IF(lwp) WRITE(numout,*) … … 155 87 IF(lwp) WRITE(numout,*) '~~~~~~~' 156 88 157 clnam0 = 'mesh_mask' ! filename (mesh and mask informations) 158 clnam1 = 'mesh' ! filename (mesh informations) 159 clnam2 = 'mask' ! filename (mask informations) 160 clnam3 = 'mesh_hgr' ! filename (horizontal mesh informations) 161 clnam4 = 'mesh_zgr' ! filename (vertical mesh informations) 162 163 SELECT CASE ( MOD(nmsh, 3) ) 164 ! ! ============================ 165 CASE ( 1 ) ! create 'mesh_mask.nc' file 166 ! ! ============================ 167 CALL iom_open( TRIM(clnam0), inum0, ldwrt = .TRUE., kiolib = jprstlib ) 168 inum2 = inum0 ! put all the informations 169 inum3 = inum0 ! in unit inum0 170 inum4 = inum0 171 172 ! ! ============================ 173 CASE ( 2 ) ! create 'mesh.nc' and 174 ! ! 'mask.nc' files 175 ! ! ============================ 176 CALL iom_open( TRIM(clnam1), inum1, ldwrt = .TRUE., kiolib = jprstlib ) 177 CALL iom_open( TRIM(clnam2), inum2, ldwrt = .TRUE., kiolib = jprstlib ) 178 inum3 = inum1 ! put mesh informations 179 inum4 = inum1 ! in unit inum1 180 ! ! ============================ 181 CASE ( 0 ) ! create 'mesh_hgr.nc' 182 ! ! 'mesh_zgr.nc' and 183 ! ! 'mask.nc' files 184 ! ! ============================ 185 CALL iom_open( TRIM(clnam2), inum2, ldwrt = .TRUE., kiolib = jprstlib ) 186 CALL iom_open( TRIM(clnam3), inum3, ldwrt = .TRUE., kiolib = jprstlib ) 187 CALL iom_open( TRIM(clnam4), inum4, ldwrt = .TRUE., kiolib = jprstlib ) 188 ! 189 END SELECT 190 191 ! ! masks (inum2) 192 CALL iom_rstput( 0, 0, inum2, 'tmask', tmask, ktype = jp_i1 ) ! ! land-sea mask 193 CALL iom_rstput( 0, 0, inum2, 'umask', umask, ktype = jp_i1 ) 194 CALL iom_rstput( 0, 0, inum2, 'vmask', vmask, ktype = jp_i1 ) 195 CALL iom_rstput( 0, 0, inum2, 'fmask', fmask, ktype = jp_i1 ) 89 clnam = 'mesh_mask' ! filename (mesh and mask informations) 90 91 ! ! ============================ 92 ! ! create 'mesh_mask.nc' file 93 ! ! ============================ 94 CALL iom_open( TRIM(clnam), inum, ldwrt = .TRUE., kiolib = jprstlib ) 95 ! 96 ! ! global domain size 97 CALL iom_rstput( 0, 0, inum, 'jpiglo', REAL( jpiglo, wp), ktype = jp_i4 ) 98 CALL iom_rstput( 0, 0, inum, 'jpjglo', REAL( jpjglo, wp), ktype = jp_i4 ) 99 CALL iom_rstput( 0, 0, inum, 'jpkglo', REAL( jpkglo, wp), ktype = jp_i4 ) 100 101 ! ! domain characteristics 102 CALL iom_rstput( 0, 0, inum, 'jperio', REAL( jperio, wp), ktype = jp_i4 ) 103 ! ! type of vertical coordinate 104 IF( ln_zco ) THEN ; izco = 1 ; ELSE ; izco = 0 ; ENDIF 105 IF( ln_zps ) THEN ; izps = 1 ; ELSE ; izps = 0 ; ENDIF 106 IF( ln_sco ) THEN ; isco = 1 ; ELSE ; isco = 0 ; ENDIF 107 CALL iom_rstput( 0, 0, inum, 'ln_zco' , REAL( izco, wp), ktype = jp_i4 ) 108 CALL iom_rstput( 0, 0, inum, 'ln_zps' , REAL( izps, wp), ktype = jp_i4 ) 109 CALL iom_rstput( 0, 0, inum, 'ln_sco' , REAL( isco, wp), ktype = jp_i4 ) 110 ! ! ocean cavities under iceshelves 111 IF( ln_isfcav ) THEN ; icav = 1 ; ELSE ; icav = 0 ; ENDIF 112 CALL iom_rstput( 0, 0, inum, 'ln_isfcav', REAL( icav, wp), ktype = jp_i4 ) 113 114 ! ! masks 115 CALL iom_rstput( 0, 0, inum, 'tmask', tmask, ktype = jp_i1 ) ! ! land-sea mask 116 CALL iom_rstput( 0, 0, inum, 'umask', umask, ktype = jp_i1 ) 117 CALL iom_rstput( 0, 0, inum, 'vmask', vmask, ktype = jp_i1 ) 118 CALL iom_rstput( 0, 0, inum, 'fmask', fmask, ktype = jp_i1 ) 196 119 197 120 CALL dom_uniq( zprw, 'T' ) 198 121 DO jj = 1, jpj 199 122 DO ji = 1, jpi 200 jk=mikt(ji,jj) 201 zprt(ji,jj) = tmask(ji,jj,jk) * zprw(ji,jj) ! ! unique point mask 123 zprt(ji,jj) = ssmask(ji,jj) * zprw(ji,jj) ! ! unique point mask 202 124 END DO 203 125 END DO ! ! unique point mask 204 CALL iom_rstput( 0, 0, inum 2, 'tmaskutil', zprt, ktype = jp_i1 )126 CALL iom_rstput( 0, 0, inum, 'tmaskutil', zprt, ktype = jp_i1 ) 205 127 CALL dom_uniq( zprw, 'U' ) 206 128 DO jj = 1, jpj 207 129 DO ji = 1, jpi 208 jk=miku(ji,jj) 209 zprt(ji,jj) = umask(ji,jj,jk) * zprw(ji,jj) ! ! unique point mask 130 zprt(ji,jj) = ssumask(ji,jj) * zprw(ji,jj) ! ! unique point mask 210 131 END DO 211 132 END DO 212 CALL iom_rstput( 0, 0, inum 2, 'umaskutil', zprt, ktype = jp_i1 )133 CALL iom_rstput( 0, 0, inum, 'umaskutil', zprt, ktype = jp_i1 ) 213 134 CALL dom_uniq( zprw, 'V' ) 214 135 DO jj = 1, jpj 215 136 DO ji = 1, jpi 216 jk=mikv(ji,jj) 217 zprt(ji,jj) = vmask(ji,jj,jk) * zprw(ji,jj) ! ! unique point mask 137 zprt(ji,jj) = ssvmask(ji,jj) * zprw(ji,jj) ! ! unique point mask 218 138 END DO 219 139 END DO 220 CALL iom_rstput( 0, 0, inum2, 'vmaskutil', zprt, ktype = jp_i1 ) 221 CALL dom_uniq( zprw, 'F' ) 222 DO jj = 1, jpj 223 DO ji = 1, jpi 224 jk=mikf(ji,jj) 225 zprt(ji,jj) = fmask(ji,jj,jk) * zprw(ji,jj) ! ! unique point mask 226 END DO 227 END DO 228 CALL iom_rstput( 0, 0, inum2, 'fmaskutil', zprt, ktype = jp_i1 ) 140 CALL iom_rstput( 0, 0, inum, 'vmaskutil', zprt, ktype = jp_i1 ) 141 !!gm ssfmask has been removed ==>> find another solution to defined fmaskutil 142 !! Here we just remove the output of fmaskutil. 143 ! CALL dom_uniq( zprw, 'F' ) 144 ! DO jj = 1, jpj 145 ! DO ji = 1, jpi 146 ! zprt(ji,jj) = ssfmask(ji,jj) * zprw(ji,jj) ! ! unique point mask 147 ! END DO 148 ! END DO 149 ! CALL iom_rstput( 0, 0, inum, 'fmaskutil', zprt, ktype = jp_i1 ) 150 !!gm 229 151 230 152 ! ! horizontal mesh (inum3) 231 CALL iom_rstput( 0, 0, inum3, 'glamt', glamt, ktype = jp_r8 ) ! ! latitude 232 CALL iom_rstput( 0, 0, inum3, 'glamu', glamu, ktype = jp_r8 ) 233 CALL iom_rstput( 0, 0, inum3, 'glamv', glamv, ktype = jp_r8 ) 234 CALL iom_rstput( 0, 0, inum3, 'glamf', glamf, ktype = jp_r8 ) 235 236 CALL iom_rstput( 0, 0, inum3, 'gphit', gphit, ktype = jp_r8 ) ! ! longitude 237 CALL iom_rstput( 0, 0, inum3, 'gphiu', gphiu, ktype = jp_r8 ) 238 CALL iom_rstput( 0, 0, inum3, 'gphiv', gphiv, ktype = jp_r8 ) 239 CALL iom_rstput( 0, 0, inum3, 'gphif', gphif, ktype = jp_r8 ) 240 241 CALL iom_rstput( 0, 0, inum3, 'e1t', e1t, ktype = jp_r8 ) ! ! e1 scale factors 242 CALL iom_rstput( 0, 0, inum3, 'e1u', e1u, ktype = jp_r8 ) 243 CALL iom_rstput( 0, 0, inum3, 'e1v', e1v, ktype = jp_r8 ) 244 CALL iom_rstput( 0, 0, inum3, 'e1f', e1f, ktype = jp_r8 ) 245 246 CALL iom_rstput( 0, 0, inum3, 'e2t', e2t, ktype = jp_r8 ) ! ! e2 scale factors 247 CALL iom_rstput( 0, 0, inum3, 'e2u', e2u, ktype = jp_r8 ) 248 CALL iom_rstput( 0, 0, inum3, 'e2v', e2v, ktype = jp_r8 ) 249 CALL iom_rstput( 0, 0, inum3, 'e2f', e2f, ktype = jp_r8 ) 250 251 CALL iom_rstput( 0, 0, inum3, 'ff', ff, ktype = jp_r8 ) ! ! coriolis factor 153 CALL iom_rstput( 0, 0, inum, 'glamt', glamt, ktype = jp_r8 ) ! ! latitude 154 CALL iom_rstput( 0, 0, inum, 'glamu', glamu, ktype = jp_r8 ) 155 CALL iom_rstput( 0, 0, inum, 'glamv', glamv, ktype = jp_r8 ) 156 CALL iom_rstput( 0, 0, inum, 'glamf', glamf, ktype = jp_r8 ) 157 158 CALL iom_rstput( 0, 0, inum, 'gphit', gphit, ktype = jp_r8 ) ! ! longitude 159 CALL iom_rstput( 0, 0, inum, 'gphiu', gphiu, ktype = jp_r8 ) 160 CALL iom_rstput( 0, 0, inum, 'gphiv', gphiv, ktype = jp_r8 ) 161 CALL iom_rstput( 0, 0, inum, 'gphif', gphif, ktype = jp_r8 ) 162 163 CALL iom_rstput( 0, 0, inum, 'e1t', e1t, ktype = jp_r8 ) ! ! e1 scale factors 164 CALL iom_rstput( 0, 0, inum, 'e1u', e1u, ktype = jp_r8 ) 165 CALL iom_rstput( 0, 0, inum, 'e1v', e1v, ktype = jp_r8 ) 166 CALL iom_rstput( 0, 0, inum, 'e1f', e1f, ktype = jp_r8 ) 167 168 CALL iom_rstput( 0, 0, inum, 'e2t', e2t, ktype = jp_r8 ) ! ! e2 scale factors 169 CALL iom_rstput( 0, 0, inum, 'e2u', e2u, ktype = jp_r8 ) 170 CALL iom_rstput( 0, 0, inum, 'e2v', e2v, ktype = jp_r8 ) 171 CALL iom_rstput( 0, 0, inum, 'e2f', e2f, ktype = jp_r8 ) 172 173 CALL iom_rstput( 0, 0, inum, 'ff_f', ff_f, ktype = jp_r8 ) ! ! coriolis factor 174 CALL iom_rstput( 0, 0, inum, 'ff_t', ff_t, ktype = jp_r8 ) 252 175 253 176 ! note that mbkt is set to 1 over land ==> use surface tmask 254 177 zprt(:,:) = ssmask(:,:) * REAL( mbkt(:,:) , wp ) 255 CALL iom_rstput( 0, 0, inum 4, 'mbathy', zprt, ktype = jp_i2) ! ! nb of ocean T-points178 CALL iom_rstput( 0, 0, inum, 'mbathy', zprt, ktype = jp_i4 ) ! ! nb of ocean T-points 256 179 zprt(:,:) = ssmask(:,:) * REAL( mikt(:,:) , wp ) 257 CALL iom_rstput( 0, 0, inum 4, 'misf', zprt, ktype = jp_i2) ! ! nb of ocean T-points180 CALL iom_rstput( 0, 0, inum, 'misf', zprt, ktype = jp_i4 ) ! ! nb of ocean T-points 258 181 zprt(:,:) = ssmask(:,:) * REAL( risfdep(:,:) , wp ) 259 CALL iom_rstput( 0, 0, inum4, 'isfdraft', zprt, ktype = jp_r8 ) ! ! nb of ocean T-points 260 261 IF( ln_sco ) THEN ! s-coordinate 262 CALL iom_rstput( 0, 0, inum4, 'hbatt', hbatt ) 263 CALL iom_rstput( 0, 0, inum4, 'hbatu', hbatu ) 264 CALL iom_rstput( 0, 0, inum4, 'hbatv', hbatv ) 265 CALL iom_rstput( 0, 0, inum4, 'hbatf', hbatf ) 266 ! 267 CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt ) ! ! scaling coef. 268 CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw ) 269 CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w ) 270 CALL iom_rstput( 0, 0, inum4, 'esigt', esigt ) 271 CALL iom_rstput( 0, 0, inum4, 'esigw', esigw ) 272 ! 273 CALL iom_rstput( 0, 0, inum4, 'e3t_0', e3t_0 ) ! ! scale factors 274 CALL iom_rstput( 0, 0, inum4, 'e3u_0', e3u_0 ) 275 CALL iom_rstput( 0, 0, inum4, 'e3v_0', e3v_0 ) 276 CALL iom_rstput( 0, 0, inum4, 'e3w_0', e3w_0 ) 277 CALL iom_rstput( 0, 0, inum4, 'rx1', rx1 ) ! ! Max. grid stiffness ratio 278 ! 279 CALL iom_rstput( 0, 0, inum4, 'gdept_1d' , gdept_1d ) ! ! stretched system 280 CALL iom_rstput( 0, 0, inum4, 'gdepw_1d' , gdepw_1d ) 281 CALL iom_rstput( 0, 0, inum4, 'gdept_0', gdept_0, ktype = jp_r8 ) 282 CALL iom_rstput( 0, 0, inum4, 'gdepw_0', gdepw_0, ktype = jp_r8 ) 283 ENDIF 284 285 IF( ln_zps ) THEN ! z-coordinate - partial steps 286 ! 287 IF( nmsh <= 6 ) THEN ! ! 3D vertical scale factors 288 CALL iom_rstput( 0, 0, inum4, 'e3t_0', e3t_0 ) 289 CALL iom_rstput( 0, 0, inum4, 'e3u_0', e3u_0 ) 290 CALL iom_rstput( 0, 0, inum4, 'e3v_0', e3v_0 ) 291 CALL iom_rstput( 0, 0, inum4, 'e3w_0', e3w_0 ) 292 ELSE ! ! 2D masked bottom ocean scale factors 293 DO jj = 1,jpj 294 DO ji = 1,jpi 295 e3tp(ji,jj) = e3t_0(ji,jj,mbkt(ji,jj)) * ssmask(ji,jj) 296 e3wp(ji,jj) = e3w_0(ji,jj,mbkt(ji,jj)) * ssmask(ji,jj) 297 END DO 298 END DO 299 CALL iom_rstput( 0, 0, inum4, 'e3t_ps', e3tp ) 300 CALL iom_rstput( 0, 0, inum4, 'e3w_ps', e3wp ) 301 END IF 302 ! 303 IF( nmsh <= 3 ) THEN ! ! 3D depth 304 CALL iom_rstput( 0, 0, inum4, 'gdept_0', gdept_0, ktype = jp_r8 ) 305 DO jk = 1,jpk 306 DO jj = 1, jpjm1 307 DO ji = 1, fs_jpim1 ! vector opt. 308 zdepu(ji,jj,jk) = MIN( gdept_0(ji,jj,jk) , gdept_0(ji+1,jj ,jk) ) 309 zdepv(ji,jj,jk) = MIN( gdept_0(ji,jj,jk) , gdept_0(ji ,jj+1,jk) ) 310 END DO 311 END DO 312 END DO 313 CALL lbc_lnk( zdepu, 'U', 1. ) ; CALL lbc_lnk( zdepv, 'V', 1. ) 314 CALL iom_rstput( 0, 0, inum4, 'gdepu', zdepu, ktype = jp_r8 ) 315 CALL iom_rstput( 0, 0, inum4, 'gdepv', zdepv, ktype = jp_r8 ) 316 CALL iom_rstput( 0, 0, inum4, 'gdepw_0', gdepw_0, ktype = jp_r8 ) 317 ELSE ! ! 2D bottom depth 318 DO jj = 1,jpj 319 DO ji = 1,jpi 320 zprt(ji,jj) = gdept_0(ji,jj,mbkt(ji,jj) ) * ssmask(ji,jj) 321 zprw(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1) * ssmask(ji,jj) 322 END DO 323 END DO 324 CALL iom_rstput( 0, 0, inum4, 'hdept', zprt, ktype = jp_r8 ) 325 CALL iom_rstput( 0, 0, inum4, 'hdepw', zprw, ktype = jp_r8 ) 326 ENDIF 327 ! 328 CALL iom_rstput( 0, 0, inum4, 'gdept_1d', gdept_1d ) ! ! reference z-coord. 329 CALL iom_rstput( 0, 0, inum4, 'gdepw_1d', gdepw_1d ) 330 CALL iom_rstput( 0, 0, inum4, 'e3t_1d' , e3t_1d ) 331 CALL iom_rstput( 0, 0, inum4, 'e3w_1d' , e3w_1d ) 332 ENDIF 333 334 IF( ln_zco ) THEN 335 ! ! z-coordinate - full steps 336 CALL iom_rstput( 0, 0, inum4, 'gdept_1d', gdept_1d ) ! ! depth 337 CALL iom_rstput( 0, 0, inum4, 'gdepw_1d', gdepw_1d ) 338 CALL iom_rstput( 0, 0, inum4, 'e3t_1d' , e3t_1d ) ! ! scale factors 339 CALL iom_rstput( 0, 0, inum4, 'e3w_1d' , e3w_1d ) 182 CALL iom_rstput( 0, 0, inum, 'isfdraft', zprt, ktype = jp_r8 ) ! ! nb of ocean T-points 183 ! ! vertical mesh 184 CALL iom_rstput( 0, 0, inum, 'e3t_0', e3t_0, ktype = jp_r8 ) ! ! scale factors 185 CALL iom_rstput( 0, 0, inum, 'e3u_0', e3u_0, ktype = jp_r8 ) 186 CALL iom_rstput( 0, 0, inum, 'e3v_0', e3v_0, ktype = jp_r8 ) 187 CALL iom_rstput( 0, 0, inum, 'e3w_0', e3w_0, ktype = jp_r8 ) 188 ! 189 CALL iom_rstput( 0, 0, inum, 'gdept_1d' , gdept_1d , ktype = jp_r8 ) ! stretched system 190 CALL iom_rstput( 0, 0, inum, 'gdepw_1d' , gdepw_1d , ktype = jp_r8 ) 191 CALL iom_rstput( 0, 0, inum, 'gdept_0' , gdept_0 , ktype = jp_r8 ) 192 CALL iom_rstput( 0, 0, inum, 'gdepw_0' , gdepw_0 , ktype = jp_r8 ) 193 ! 194 IF( ln_sco ) THEN ! s-coordinate stiffness 195 CALL dom_stiff( zprt ) 196 CALL iom_rstput( 0, 0, inum, 'stiffness', zprt ) ! ! Max. grid stiffness ratio 340 197 ENDIF 341 198 ! ! ============================ 342 !! close the files199 CALL iom_close( inum ) ! close the files 343 200 ! ! ============================ 344 SELECT CASE ( MOD(nmsh, 3) )345 CASE ( 1 )346 CALL iom_close( inum0 )347 CASE ( 2 )348 CALL iom_close( inum1 )349 CALL iom_close( inum2 )350 CASE ( 0 )351 CALL iom_close( inum2 )352 CALL iom_close( inum3 )353 CALL iom_close( inum4 )354 END SELECT355 201 ! 356 202 CALL wrk_dealloc( jpi, jpj, zprt, zprw ) … … 371 217 !! 2) check which elements have been changed 372 218 !!---------------------------------------------------------------------- 373 !374 219 CHARACTER(len=1) , INTENT(in ) :: cdgrd ! 375 220 REAL(wp), DIMENSION(:,:), INTENT(inout) :: puniq ! … … 405 250 END SUBROUTINE dom_uniq 406 251 252 253 SUBROUTINE dom_stiff( px1 ) 254 !!---------------------------------------------------------------------- 255 !! *** ROUTINE dom_stiff *** 256 !! 257 !! ** Purpose : Diagnose maximum grid stiffness/hydrostatic consistency 258 !! 259 !! ** Method : Compute Haney (1991) hydrostatic condition ratio 260 !! Save the maximum in the vertical direction 261 !! (this number is only relevant in s-coordinates) 262 !! 263 !! Haney, 1991, J. Phys. Oceanogr., 21, 610-619. 264 !!---------------------------------------------------------------------- 265 REAL(wp), DIMENSION(:,:), INTENT(out), OPTIONAL :: px1 ! stiffness 266 ! 267 INTEGER :: ji, jj, jk 268 REAL(wp) :: zrxmax 269 REAL(wp), DIMENSION(4) :: zr1 270 REAL(wp), DIMENSION(jpi,jpj) :: zx1 271 !!---------------------------------------------------------------------- 272 zx1(:,:) = 0._wp 273 zrxmax = 0._wp 274 zr1(:) = 0._wp 275 ! 276 DO ji = 2, jpim1 277 DO jj = 2, jpjm1 278 DO jk = 1, jpkm1 279 !!gm remark: dk(gdepw) = e3t ===>>> possible simplification of the following calculation.... 280 !! especially since it is gde3w which is used to compute the pressure gradient 281 !! furthermore, I think gdept_0 should be used below instead of w point in the numerator 282 !! so that the ratio is computed at the same point (i.e. uw and vw) .... 283 zr1(1) = ABS( ( gdepw_0(ji ,jj,jk )-gdepw_0(ji-1,jj,jk ) & 284 & +gdepw_0(ji ,jj,jk+1)-gdepw_0(ji-1,jj,jk+1) ) & 285 & / ( gdepw_0(ji ,jj,jk )+gdepw_0(ji-1,jj,jk ) & 286 & -gdepw_0(ji ,jj,jk+1)-gdepw_0(ji-1,jj,jk+1) + rsmall ) ) * umask(ji-1,jj,jk) 287 zr1(2) = ABS( ( gdepw_0(ji+1,jj,jk )-gdepw_0(ji ,jj,jk ) & 288 & +gdepw_0(ji+1,jj,jk+1)-gdepw_0(ji ,jj,jk+1) ) & 289 & / ( gdepw_0(ji+1,jj,jk )+gdepw_0(ji ,jj,jk ) & 290 & -gdepw_0(ji+1,jj,jk+1)-gdepw_0(ji ,jj,jk+1) + rsmall ) ) * umask(ji ,jj,jk) 291 zr1(3) = ABS( ( gdepw_0(ji,jj+1,jk )-gdepw_0(ji,jj ,jk ) & 292 & +gdepw_0(ji,jj+1,jk+1)-gdepw_0(ji,jj ,jk+1) ) & 293 & / ( gdepw_0(ji,jj+1,jk )+gdepw_0(ji,jj ,jk ) & 294 & -gdepw_0(ji,jj+1,jk+1)-gdepw_0(ji,jj ,jk+1) + rsmall ) ) * vmask(ji,jj ,jk) 295 zr1(4) = ABS( ( gdepw_0(ji,jj ,jk )-gdepw_0(ji,jj-1,jk ) & 296 & +gdepw_0(ji,jj ,jk+1)-gdepw_0(ji,jj-1,jk+1) ) & 297 & / ( gdepw_0(ji,jj ,jk )+gdepw_0(ji,jj-1,jk ) & 298 & -gdepw_0(ji,jj ,jk+1)-gdepw_0(ji,jj-1,jk+1) + rsmall ) ) * vmask(ji,jj-1,jk) 299 zrxmax = MAXVAL( zr1(1:4) ) 300 zx1(ji,jj) = MAX( zx1(ji,jj) , zrxmax ) 301 END DO 302 END DO 303 END DO 304 CALL lbc_lnk( zx1, 'T', 1. ) 305 ! 306 IF( PRESENT( px1 ) ) px1 = zx1 307 ! 308 zrxmax = MAXVAL( zx1 ) 309 ! 310 IF( lk_mpp ) CALL mpp_max( zrxmax ) ! max over the global domain 311 ! 312 IF(lwp) THEN 313 WRITE(numout,*) 314 WRITE(numout,*) 'dom_stiff : maximum grid stiffness ratio: ', zrxmax 315 WRITE(numout,*) '~~~~~~~~~' 316 ENDIF 317 ! 318 END SUBROUTINE dom_stiff 319 407 320 !!====================================================================== 408 321 END MODULE domwri -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90
r7412 r7421 22 22 23 23 !!---------------------------------------------------------------------- 24 !! dom_zgr : defined the ocean vertical coordinate system 25 !! zgr_bat : bathymetry fields (levels and meters) 26 !! zgr_bat_zoom : modify the bathymetry field if zoom domain 27 !! zgr_bat_ctl : check the bathymetry files 28 !! zgr_bot_level: deepest ocean level for t-, u, and v-points 29 !! zgr_z : reference z-coordinate 30 !! zgr_zco : z-coordinate 31 !! zgr_zps : z-coordinate with partial steps 32 !! zgr_sco : s-coordinate 33 !! fssig : tanh stretch function 34 !! fssig1 : Song and Haidvogel 1994 stretch function 35 !! fgamma : Siddorn and Furner 2012 stretching function 24 !! dom_zgr : read or set the ocean vertical coordinate system 25 !! zgr_read : read the vertical information in the domain configuration file 26 !! zgr_top_bot : ocean top and bottom level for t-, u, and v-points with 1 as minimum value 36 27 !!--------------------------------------------------------------------- 37 USE oce ! ocean variables 38 USE dom_oce ! ocean domain 39 USE wet_dry ! wetting and drying 40 USE closea ! closed seas 41 USE c1d ! 1D vertical configuration 28 USE oce ! ocean variables 29 USE dom_oce ! ocean domain 30 USE usrdef_zgr ! user defined vertical coordinate system 31 USE depth_e3 ! depth <=> e3 42 32 ! 43 USE in_out_manager 44 USE iom 45 USE lbclnk 46 USE lib_mpp 47 USE wrk_nemo 48 USE timing 33 USE in_out_manager ! I/O manager 34 USE iom ! I/O library 35 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 36 USE lib_mpp ! distributed memory computing library 37 USE wrk_nemo ! Memory allocation 38 USE timing ! Timing 49 39 50 40 IMPLICIT NONE … … 52 42 53 43 PUBLIC dom_zgr ! called by dom_init.F90 54 55 ! !!* Namelist namzgr_sco *56 LOGICAL :: ln_s_sh94 ! use hybrid s-sig Song and Haidvogel 1994 stretching function fssig1 (ln_sco=T)57 LOGICAL :: ln_s_sf12 ! use hybrid s-z-sig Siddorn and Furner 2012 stretching function fgamma (ln_sco=T)58 !59 REAL(wp) :: rn_sbot_min ! minimum depth of s-bottom surface (>0) (m)60 REAL(wp) :: rn_sbot_max ! maximum depth of s-bottom surface (= ocean depth) (>0) (m)61 REAL(wp) :: rn_rmax ! maximum cut-off r-value allowed (0<rn_rmax<1)62 REAL(wp) :: rn_hc ! Critical depth for transition from sigma to stretched coordinates63 ! Song and Haidvogel 1994 stretching parameters64 REAL(wp) :: rn_theta ! surface control parameter (0<=rn_theta<=20)65 REAL(wp) :: rn_thetb ! bottom control parameter (0<=rn_thetb<= 1)66 REAL(wp) :: rn_bb ! stretching parameter67 ! ! ( rn_bb=0; top only, rn_bb =1; top and bottom)68 ! Siddorn and Furner stretching parameters69 LOGICAL :: ln_sigcrit ! use sigma coordinates below critical depth (T) or Z coordinates (F) for Siddorn & Furner stretch70 REAL(wp) :: rn_alpha ! control parameter ( > 1 stretch towards surface, < 1 towards seabed)71 REAL(wp) :: rn_efold ! efold length scale for transition to stretched coord72 REAL(wp) :: rn_zs ! depth of surface grid box73 ! bottom cell depth (Zb) is a linear function of water depth Zb = H*a + b74 REAL(wp) :: rn_zb_a ! bathymetry scaling factor for calculating Zb75 REAL(wp) :: rn_zb_b ! offset for calculating Zb76 44 77 45 !! * Substitutions … … 84 52 CONTAINS 85 53 86 SUBROUTINE dom_zgr 54 SUBROUTINE dom_zgr( k_top, k_bot ) 87 55 !!---------------------------------------------------------------------- 88 56 !! *** ROUTINE dom_zgr *** … … 101 69 !! ** Action : define gdep., e3., mbathy and bathy 102 70 !!---------------------------------------------------------------------- 103 INTEGER :: ioptio, ibat ! local integer 104 INTEGER :: ios 105 ! 106 NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco, ln_isfcav, ln_linssh 71 INTEGER, DIMENSION(:,:), INTENT(out) :: k_top, k_bot ! ocean first and last level indices 72 ! 73 INTEGER :: jk ! dummy loop index 74 INTEGER :: ioptio, ibat, ios ! local integer 75 REAL(wp) :: zrefdep ! depth of the reference level (~10m) 107 76 !!---------------------------------------------------------------------- 108 77 ! 109 78 IF( nn_timing == 1 ) CALL timing_start('dom_zgr') 110 79 ! 111 REWIND( numnam_ref ) ! Namelist namzgr in reference namelist : Vertical coordinate112 READ ( numnam_ref, namzgr, IOSTAT = ios, ERR = 901 )113 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzgr in reference namelist', lwp )114 115 REWIND( numnam_cfg ) ! Namelist namzgr in configuration namelist : Vertical coordinate116 READ ( numnam_cfg, namzgr, IOSTAT = ios, ERR = 902 )117 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzgr in configuration namelist', lwp )118 IF(lwm) WRITE ( numond, namzgr )119 120 80 IF(lwp) THEN ! Control print 121 81 WRITE(numout,*) 122 82 WRITE(numout,*) 'dom_zgr : vertical coordinate' 123 83 WRITE(numout,*) '~~~~~~~' 124 WRITE(numout,*) ' Namelist namzgr : set vertical coordinate' 84 ENDIF 85 86 IF( ln_linssh .AND. lwp) WRITE(numout,*) ' linear free surface: the vertical mesh does not change in time' 87 88 89 IF( ln_read_cfg ) THEN !== read in mesh_mask.nc file ==! 90 IF(lwp) WRITE(numout,*) 91 IF(lwp) WRITE(numout,*) ' Read vertical mesh in ', TRIM( cn_domcfg ), ' file' 92 ! 93 CALL zgr_read ( ln_zco , ln_zps , ln_sco, ln_isfcav, & 94 & gdept_1d, gdepw_1d, e3t_1d, e3w_1d , & ! 1D gridpoints depth 95 & gdept_0 , gdepw_0 , & ! gridpoints depth 96 & e3t_0 , e3u_0 , e3v_0 , e3f_0 , & ! vertical scale factors 97 & e3w_0 , e3uw_0 , e3vw_0 , & ! vertical scale factors 98 & k_top , k_bot ) ! 1st & last ocean level 99 ! 100 ELSE !== User defined configuration ==! 101 IF(lwp) WRITE(numout,*) 102 IF(lwp) WRITE(numout,*) ' User defined vertical mesh (usr_def_zgr)' 103 ! 104 CALL usr_def_zgr( ln_zco , ln_zps , ln_sco, ln_isfcav, & 105 & gdept_1d, gdepw_1d, e3t_1d, e3w_1d , & ! 1D gridpoints depth 106 & gdept_0 , gdepw_0 , & ! gridpoints depth 107 & e3t_0 , e3u_0 , e3v_0 , e3f_0 , & ! vertical scale factors 108 & e3w_0 , e3uw_0 , e3vw_0 , & ! vertical scale factors 109 & k_top , k_bot ) ! 1st & last ocean level 110 ! 111 ENDIF 112 ! 113 !!gm to be remove when removing the OLD definition of e3 scale factors so that gde3w disappears 114 ! Compute gde3w_0 (vertical sum of e3w) 115 gde3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 116 DO jk = 2, jpk 117 gde3w_0(:,:,jk) = gde3w_0(:,:,jk-1) + e3w_0(:,:,jk) 118 END DO 119 ! 120 IF(lwp) THEN ! Control print 121 WRITE(numout,*) 122 WRITE(numout,*) ' Type of vertical coordinate (read in ', TRIM( cn_domcfg ), ' file or set in userdef_nam) :' 125 123 WRITE(numout,*) ' z-coordinate - full steps ln_zco = ', ln_zco 126 124 WRITE(numout,*) ' z-coordinate - partial steps ln_zps = ', ln_zps 127 125 WRITE(numout,*) ' s- or hybrid z-s-coordinate ln_sco = ', ln_sco 128 126 WRITE(numout,*) ' ice shelf cavities ln_isfcav = ', ln_isfcav 129 WRITE(numout,*) ' linear free surface ln_linssh = ', ln_linssh 130 ENDIF 131 132 IF( ln_linssh .AND. lwp) WRITE(numout,*) ' linear free surface: the vertical mesh does not change in time' 127 ENDIF 133 128 134 129 ioptio = 0 ! Check Vertical coordinate options … … 137 132 IF( ln_sco ) ioptio = ioptio + 1 138 133 IF( ioptio /= 1 ) CALL ctl_stop( ' none or several vertical coordinate options used' ) 139 ! 140 ioptio = 0 141 IF ( ln_zco .AND. ln_isfcav ) ioptio = ioptio + 1 142 IF ( ln_sco .AND. ln_isfcav ) ioptio = ioptio + 1 143 IF( ioptio > 0 ) CALL ctl_stop( ' Cavity not tested/compatible with full step (zco) and sigma (ln_sco) ' ) 144 ! 145 ! Build the vertical coordinate system 146 ! ------------------------------------ 147 CALL zgr_z ! Reference z-coordinate system (always called) 148 CALL zgr_bat ! Bathymetry fields (levels and meters) 149 IF( lk_c1d ) CALL lbc_lnk( bathy , 'T', 1._wp ) ! 1D config.: same bathy value over the 3x3 domain 150 IF( ln_zco ) CALL zgr_zco ! z-coordinate 151 IF( ln_zps ) CALL zgr_zps ! Partial step z-coordinate 152 IF( ln_sco ) CALL zgr_sco ! s-coordinate or hybrid z-s coordinate 153 ! 154 ! final adjustment of mbathy & check 155 ! ----------------------------------- 156 IF( lzoom ) CALL zgr_bat_zoom ! correct mbathy in case of zoom subdomain 157 IF( .NOT.lk_c1d ) CALL zgr_bat_ctl ! check bathymetry (mbathy) and suppress isolated ocean points 158 CALL zgr_bot_level ! deepest ocean level for t-, u- and v-points 159 CALL zgr_top_level ! shallowest ocean level for T-, U-, V- points 160 ! 161 IF( lk_c1d ) THEN ! 1D config.: same mbathy value over the 3x3 domain 162 ibat = mbathy(2,2) 163 mbathy(:,:) = ibat 164 END IF 134 135 136 ! ! top/bottom ocean level indices for t-, u- and v-points (f-point also for top) 137 CALL zgr_top_bot( k_top, k_bot ) ! with a minimum value set to 1 138 139 140 ! ! deepest/shallowest W level Above/Below ~10m 141 !!gm BUG in s-coordinate this does not work! 142 zrefdep = 10._wp - 0.1_wp * MINVAL( e3w_1d ) ! ref. depth with tolerance (10% of minimum layer thickness) 143 nlb10 = MINLOC( gdepw_1d, mask = gdepw_1d > zrefdep, dim = 1 ) ! shallowest W level Below ~10m 144 nla10 = nlb10 - 1 ! deepest W level Above ~10m 145 !!gm end bug 165 146 ! 166 147 IF( nprint == 1 .AND. lwp ) THEN 167 WRITE(numout,*) ' MIN val mbathy ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 148 WRITE(numout,*) ' MIN val k_top ', MINVAL( k_top(:,:) ), ' MAX ', MAXVAL( k_top(:,:) ) 149 WRITE(numout,*) ' MIN val k_bot ', MINVAL( k_bot(:,:) ), ' MAX ', MAXVAL( k_bot(:,:) ) 168 150 WRITE(numout,*) ' MIN val depth t ', MINVAL( gdept_0(:,:,:) ), & 169 151 & ' w ', MINVAL( gdepw_0(:,:,:) ), '3w ', MINVAL( gde3w_0(:,:,:) ) … … 186 168 187 169 188 SUBROUTINE zgr_z 189 !!---------------------------------------------------------------------- 190 !! *** ROUTINE zgr_z *** 191 !! 192 !! ** Purpose : set the depth of model levels and the resulting 193 !! vertical scale factors. 194 !! 195 !! ** Method : z-coordinate system (use in all type of coordinate) 196 !! The depth of model levels is defined from an analytical 197 !! function the derivative of which gives the scale factors. 198 !! both depth and scale factors only depend on k (1d arrays). 199 !! w-level: gdepw_1d = gdep(k) 200 !! e3w_1d(k) = dk(gdep)(k) = e3(k) 201 !! t-level: gdept_1d = gdep(k+0.5) 202 !! e3t_1d(k) = dk(gdep)(k+0.5) = e3(k+0.5) 203 !! 204 !! ** Action : - gdept_1d, gdepw_1d : depth of T- and W-point (m) 205 !! - e3t_1d , e3w_1d : scale factors at T- and W-levels (m) 206 !! 207 !! Reference : Marti, Madec & Delecluse, 1992, JGR, 97, No8, 12,763-12,766. 208 !!---------------------------------------------------------------------- 209 INTEGER :: jk ! dummy loop indices 210 REAL(wp) :: zt, zw ! temporary scalars 211 REAL(wp) :: zsur, za0, za1, zkth ! Values set from parameters in 212 REAL(wp) :: zacr, zdzmin, zhmax ! par_CONFIG_Rxx.h90 213 REAL(wp) :: zrefdep ! depth of the reference level (~10m) 214 REAL(wp) :: za2, zkth2, zacr2 ! Values for optional double tanh function set from parameters 215 !!---------------------------------------------------------------------- 216 ! 217 IF( nn_timing == 1 ) CALL timing_start('zgr_z') 218 ! 219 ! Set variables from parameters 220 ! ------------------------------ 221 zkth = ppkth ; zacr = ppacr 222 zdzmin = ppdzmin ; zhmax = pphmax 223 zkth2 = ppkth2 ; zacr2 = ppacr2 ! optional (ldbletanh=T) double tanh parameters 224 225 ! If ppa1 and ppa0 and ppsur are et to pp_to_be_computed 226 ! za0, za1, zsur are computed from ppdzmin , pphmax, ppkth, ppacr 227 IF( ppa1 == pp_to_be_computed .AND. & 228 & ppa0 == pp_to_be_computed .AND. & 229 & ppsur == pp_to_be_computed ) THEN 230 ! 231 #if defined key_agrif 232 za1 = ( ppdzmin - pphmax / FLOAT(jpkdta-1) ) & 233 & / ( TANH((1-ppkth)/ppacr) - ppacr/FLOAT(jpkdta-1) * ( LOG( COSH( (jpkdta - ppkth) / ppacr) )& 234 & - LOG( COSH( ( 1 - ppkth) / ppacr) ) ) ) 235 #else 236 za1 = ( ppdzmin - pphmax / FLOAT(jpkm1) ) & 237 & / ( TANH((1-ppkth)/ppacr) - ppacr/FLOAT(jpk-1) * ( LOG( COSH( (jpk - ppkth) / ppacr) ) & 238 & - LOG( COSH( ( 1 - ppkth) / ppacr) ) ) ) 239 #endif 240 za0 = ppdzmin - za1 * TANH( (1-ppkth) / ppacr ) 241 zsur = - za0 - za1 * ppacr * LOG( COSH( (1-ppkth) / ppacr ) ) 242 ELSE 243 za1 = ppa1 ; za0 = ppa0 ; zsur = ppsur 244 za2 = ppa2 ! optional (ldbletanh=T) double tanh parameter 245 ENDIF 246 247 IF(lwp) THEN ! Parameter print 170 SUBROUTINE zgr_read( ld_zco , ld_zps , ld_sco , ld_isfcav, & ! type of vertical coordinate 171 & pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d , & ! 1D reference vertical coordinate 172 & pdept , pdepw , & ! 3D t & w-points depth 173 & pe3t , pe3u , pe3v , pe3f , & ! vertical scale factors 174 & pe3w , pe3uw , pe3vw , & ! - - - 175 & k_top , k_bot ) ! top & bottom ocean level 176 !!--------------------------------------------------------------------- 177 !! *** ROUTINE zgr_read *** 178 !! 179 !! ** Purpose : Read the vertical information in the domain configuration file 180 !! 181 !!---------------------------------------------------------------------- 182 LOGICAL , INTENT(out) :: ld_zco, ld_zps, ld_sco ! vertical coordinate flags 183 LOGICAL , INTENT(out) :: ld_isfcav ! under iceshelf cavity flag 184 REAL(wp), DIMENSION(:) , INTENT(out) :: pdept_1d, pdepw_1d ! 1D grid-point depth [m] 185 REAL(wp), DIMENSION(:) , INTENT(out) :: pe3t_1d , pe3w_1d ! 1D vertical scale factors [m] 186 REAL(wp), DIMENSION(:,:,:), INTENT(out) :: pdept, pdepw ! grid-point depth [m] 187 REAL(wp), DIMENSION(:,:,:), INTENT(out) :: pe3t , pe3u , pe3v , pe3f ! vertical scale factors [m] 188 REAL(wp), DIMENSION(:,:,:), INTENT(out) :: pe3w , pe3uw, pe3vw ! - - - 189 INTEGER , DIMENSION(:,:) , INTENT(out) :: k_top , k_bot ! first & last ocean level 190 ! 191 INTEGER :: jk ! dummy loop index 192 INTEGER :: inum ! local logical unit 193 REAL(WP) :: z_zco, z_zps, z_sco, z_cav 194 REAL(wp), DIMENSION(jpi,jpj) :: z2d ! 2D workspace 195 !!---------------------------------------------------------------------- 196 ! 197 IF(lwp) THEN 248 198 WRITE(numout,*) 249 WRITE(numout,*) ' zgr_z : Reference vertical z-coordinates' 250 WRITE(numout,*) ' ~~~~~~~' 251 IF( ppkth == 0._wp ) THEN 252 WRITE(numout,*) ' Uniform grid with ',jpk-1,' layers' 253 WRITE(numout,*) ' Total depth :', zhmax 254 #if defined key_agrif 255 WRITE(numout,*) ' Layer thickness:', zhmax/(jpkdta-1) 256 #else 257 WRITE(numout,*) ' Layer thickness:', zhmax/(jpk-1) 258 #endif 259 ELSE 260 IF( ppa1 == 0._wp .AND. ppa0 == 0._wp .AND. ppsur == 0._wp ) THEN 261 WRITE(numout,*) ' zsur, za0, za1 computed from ' 262 WRITE(numout,*) ' zdzmin = ', zdzmin 263 WRITE(numout,*) ' zhmax = ', zhmax 264 ENDIF 265 WRITE(numout,*) ' Value of coefficients for vertical mesh:' 266 WRITE(numout,*) ' zsur = ', zsur 267 WRITE(numout,*) ' za0 = ', za0 268 WRITE(numout,*) ' za1 = ', za1 269 WRITE(numout,*) ' zkth = ', zkth 270 WRITE(numout,*) ' zacr = ', zacr 271 IF( ldbletanh ) THEN 272 WRITE(numout,*) ' (Double tanh za2 = ', za2 273 WRITE(numout,*) ' parameters) zkth2= ', zkth2 274 WRITE(numout,*) ' zacr2= ', zacr2 275 ENDIF 199 WRITE(numout,*) ' zgr_read : read the vertical coordinates in ', TRIM( cn_domcfg ), ' file' 200 WRITE(numout,*) ' ~~~~~~~~' 201 ENDIF 202 ! 203 CALL iom_open( cn_domcfg, inum ) 204 ! 205 ! !* type of vertical coordinate 206 CALL iom_get( inum, 'ln_zco' , z_zco ) 207 CALL iom_get( inum, 'ln_zps' , z_zps ) 208 CALL iom_get( inum, 'ln_sco' , z_sco ) 209 IF( z_zco == 0._wp ) THEN ; ld_zco = .false. ; ELSE ; ld_zco = .true. ; ENDIF 210 IF( z_zps == 0._wp ) THEN ; ld_zps = .false. ; ELSE ; ld_zps = .true. ; ENDIF 211 IF( z_sco == 0._wp ) THEN ; ld_sco = .false. ; ELSE ; ld_sco = .true. ; ENDIF 212 ! 213 ! !* ocean cavities under iceshelves 214 CALL iom_get( inum, 'ln_isfcav', z_cav ) 215 IF( z_cav == 0._wp ) THEN ; ld_isfcav = .false. ; ELSE ; ld_isfcav = .true. ; ENDIF 216 ! 217 ! !* vertical scale factors 218 CALL iom_get( inum, jpdom_unknown, 'e3t_1d' , pe3t_1d ) ! 1D reference coordinate 219 CALL iom_get( inum, jpdom_unknown, 'e3w_1d' , pe3w_1d ) 220 ! 221 CALL iom_get( inum, jpdom_data, 'e3t_0' , pe3t , lrowattr=ln_use_jattr ) ! 3D coordinate 222 CALL iom_get( inum, jpdom_data, 'e3u_0' , pe3u , lrowattr=ln_use_jattr ) 223 CALL iom_get( inum, jpdom_data, 'e3v_0' , pe3v , lrowattr=ln_use_jattr ) 224 CALL iom_get( inum, jpdom_data, 'e3f_0' , pe3f , lrowattr=ln_use_jattr ) 225 CALL iom_get( inum, jpdom_data, 'e3w_0' , pe3w , lrowattr=ln_use_jattr ) 226 CALL iom_get( inum, jpdom_data, 'e3uw_0' , pe3uw , lrowattr=ln_use_jattr ) 227 CALL iom_get( inum, jpdom_data, 'e3vw_0' , pe3vw , lrowattr=ln_use_jattr ) 228 ! 229 ! !* depths 230 ! !- old depth definition (obsolescent feature) 231 IF( iom_varid( inum, 'gdept_1d', ldstop = .FALSE. ) > 0 .AND. & 232 & iom_varid( inum, 'gdepw_1d', ldstop = .FALSE. ) > 0 .AND. & 233 & iom_varid( inum, 'gdept_0' , ldstop = .FALSE. ) > 0 .AND. & 234 & iom_varid( inum, 'gdepw_0' , ldstop = .FALSE. ) > 0 ) THEN 235 CALL ctl_warn( 'zgr_read : old definition of depths and scale factors used ', & 236 & ' depths at t- and w-points read in the domain configuration file') 237 CALL iom_get( inum, jpdom_unknown, 'gdept_1d', pdept_1d ) 238 CALL iom_get( inum, jpdom_unknown, 'gdepw_1d', pdepw_1d ) 239 CALL iom_get( inum, jpdom_data , 'gdept_0' , pdept , lrowattr=ln_use_jattr ) 240 CALL iom_get( inum, jpdom_data , 'gdepw_0' , pdepw , lrowattr=ln_use_jattr ) 241 ! 242 ELSE !- depths computed from e3. scale factors 243 CALL e3_to_depth( pe3t_1d, pe3w_1d, pdept_1d, pdepw_1d ) ! 1D reference depth 244 CALL e3_to_depth( pe3t , pe3w , pdept , pdepw ) ! 3D depths 245 IF(lwp) THEN 246 WRITE(numout,*) 247 WRITE(numout,*) ' Reference 1D z-coordinate depth and scale factors:' 248 WRITE(numout, "(9x,' level gdept_1d gdepw_1d e3t_1d e3w_1d ')" ) 249 WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, pdept_1d(jk), pdepw_1d(jk), pe3t_1d(jk), pe3w_1d(jk), jk = 1, jpk ) 276 250 ENDIF 277 251 ENDIF 278 279 280 ! Reference z-coordinate (depth - scale factor at T- and W-points) 281 ! ====================== 282 IF( ppkth == 0._wp ) THEN ! uniform vertical grid 283 #if defined key_agrif 284 za1 = zhmax / FLOAT(jpkdta-1) 285 #else 286 za1 = zhmax / FLOAT(jpk-1) 287 #endif 288 DO jk = 1, jpk 289 zw = FLOAT( jk ) 290 zt = FLOAT( jk ) + 0.5_wp 291 gdepw_1d(jk) = ( zw - 1 ) * za1 292 gdept_1d(jk) = ( zt - 1 ) * za1 293 e3w_1d (jk) = za1 294 e3t_1d (jk) = za1 295 END DO 296 ELSE ! Madec & Imbard 1996 function 297 IF( .NOT. ldbletanh ) THEN 298 DO jk = 1, jpk 299 zw = REAL( jk , wp ) 300 zt = REAL( jk , wp ) + 0.5_wp 301 gdepw_1d(jk) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth) / zacr ) ) ) 302 gdept_1d(jk) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth) / zacr ) ) ) 303 e3w_1d (jk) = za0 + za1 * TANH( (zw-zkth) / zacr ) 304 e3t_1d (jk) = za0 + za1 * TANH( (zt-zkth) / zacr ) 305 END DO 306 ELSE 307 DO jk = 1, jpk 308 zw = FLOAT( jk ) 309 zt = FLOAT( jk ) + 0.5_wp 310 ! Double tanh function 311 gdepw_1d(jk) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth ) / zacr ) ) & 312 & + za2 * zacr2* LOG ( COSH( (zw-zkth2) / zacr2 ) ) ) 313 gdept_1d(jk) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth ) / zacr ) ) & 314 & + za2 * zacr2* LOG ( COSH( (zt-zkth2) / zacr2 ) ) ) 315 e3w_1d (jk) = za0 + za1 * TANH( (zw-zkth ) / zacr ) & 316 & + za2 * TANH( (zw-zkth2) / zacr2 ) 317 e3t_1d (jk) = za0 + za1 * TANH( (zt-zkth ) / zacr ) & 318 & + za2 * TANH( (zt-zkth2) / zacr2 ) 319 END DO 320 ENDIF 321 gdepw_1d(1) = 0._wp ! force first w-level to be exactly at zero 322 ENDIF 323 324 IF ( ln_isfcav ) THEN 325 ! need to be like this to compute the pressure gradient with ISF. If not, level beneath the ISF are not aligned (sum(e3t) /= depth) 326 ! define e3t_0 and e3w_0 as the differences between gdept and gdepw respectively 327 DO jk = 1, jpkm1 328 e3t_1d(jk) = gdepw_1d(jk+1)-gdepw_1d(jk) 329 END DO 330 e3t_1d(jpk) = e3t_1d(jpk-1) ! we don't care because this level is masked in NEMO 331 332 DO jk = 2, jpk 333 e3w_1d(jk) = gdept_1d(jk) - gdept_1d(jk-1) 334 END DO 335 e3w_1d(1 ) = 2._wp * (gdept_1d(1) - gdepw_1d(1)) 336 END IF 337 338 !!gm BUG in s-coordinate this does not work! 339 ! deepest/shallowest W level Above/Below ~10m 340 zrefdep = 10._wp - 0.1_wp * MINVAL( e3w_1d ) ! ref. depth with tolerance (10% of minimum layer thickness) 341 nlb10 = MINLOC( gdepw_1d, mask = gdepw_1d > zrefdep, dim = 1 ) ! shallowest W level Below ~10m 342 nla10 = nlb10 - 1 ! deepest W level Above ~10m 343 !!gm end bug 344 345 IF(lwp) THEN ! control print 346 WRITE(numout,*) 347 WRITE(numout,*) ' Reference z-coordinate depth and scale factors:' 348 WRITE(numout, "(9x,' level gdept_1d gdepw_1d e3t_1d e3w_1d ')" ) 349 WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, gdept_1d(jk), gdepw_1d(jk), e3t_1d(jk), e3w_1d(jk), jk = 1, jpk ) 350 ENDIF 351 DO jk = 1, jpk ! control positivity 352 IF( e3w_1d (jk) <= 0._wp .OR. e3t_1d (jk) <= 0._wp ) CALL ctl_stop( 'dom:zgr_z: e3w_1d or e3t_1d =< 0 ' ) 353 IF( gdepw_1d(jk) < 0._wp .OR. gdept_1d(jk) < 0._wp ) CALL ctl_stop( 'dom:zgr_z: gdepw_1d or gdept_1d < 0 ' ) 354 END DO 355 ! 356 IF( nn_timing == 1 ) CALL timing_stop('zgr_z') 357 ! 358 END SUBROUTINE zgr_z 359 360 361 SUBROUTINE zgr_bat 362 !!---------------------------------------------------------------------- 363 !! *** ROUTINE zgr_bat *** 364 !! 365 !! ** Purpose : set bathymetry both in levels and meters 366 !! 367 !! ** Method : read or define mbathy and bathy arrays 368 !! * level bathymetry: 369 !! The ocean basin geometry is given by a two-dimensional array, 370 !! mbathy, which is defined as follow : 371 !! mbathy(ji,jj) = 1, ..., jpk-1, the number of ocean level 372 !! at t-point (ji,jj). 373 !! = 0 over the continental t-point. 374 !! The array mbathy is checked to verified its consistency with 375 !! model option. in particular: 376 !! mbathy must have at least 1 land grid-points (mbathy<=0) 377 !! along closed boundary. 378 !! mbathy must be cyclic IF jperio=1. 379 !! mbathy must be lower or equal to jpk-1. 380 !! isolated ocean grid points are suppressed from mbathy 381 !! since they are only connected to remaining 382 !! ocean through vertical diffusion. 383 !! ntopo=-1 : rectangular channel or bassin with a bump 384 !! ntopo= 0 : flat rectangular channel or basin 385 !! ntopo= 1 : mbathy is read in 'bathy_level.nc' NetCDF file 386 !! bathy is read in 'bathy_meter.nc' NetCDF file 387 !! 388 !! ** Action : - mbathy: level bathymetry (in level index) 389 !! - bathy : meter bathymetry (in meters) 390 !!---------------------------------------------------------------------- 391 INTEGER :: ji, jj, jk ! dummy loop indices 392 INTEGER :: inum ! temporary logical unit 393 INTEGER :: ierror ! error flag 394 INTEGER :: ii_bump, ij_bump, ih ! bump center position 395 INTEGER :: ii0, ii1, ij0, ij1, ik ! local indices 396 REAL(wp) :: r_bump , h_bump , h_oce ! bump characteristics 397 REAL(wp) :: zi, zj, zh, zhmin ! local scalars 398 INTEGER , ALLOCATABLE, DIMENSION(:,:) :: idta ! global domain integer data 399 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zdta ! global domain scalar data 400 !!---------------------------------------------------------------------- 401 ! 402 IF( nn_timing == 1 ) CALL timing_start('zgr_bat') 403 ! 404 IF(lwp) WRITE(numout,*) 405 IF(lwp) WRITE(numout,*) ' zgr_bat : defines level and meter bathymetry' 406 IF(lwp) WRITE(numout,*) ' ~~~~~~~' 407 ! ! ================== ! 408 IF( ntopo == 0 .OR. ntopo == -1 ) THEN ! defined by hand ! 409 ! ! ================== ! 410 ! ! global domain level and meter bathymetry (idta,zdta) 411 ! 412 ALLOCATE( idta(jpidta,jpjdta), STAT=ierror ) 413 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate idta array' ) 414 ALLOCATE( zdta(jpidta,jpjdta), STAT=ierror ) 415 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate zdta array' ) 416 ! 417 IF( ntopo == 0 ) THEN ! flat basin 418 IF(lwp) WRITE(numout,*) 419 IF(lwp) WRITE(numout,*) ' bathymetry field: flat basin' 420 IF( rn_bathy > 0.01 ) THEN 421 IF(lwp) WRITE(numout,*) ' Depth = rn_bathy read in namelist' 422 zdta(:,:) = rn_bathy 423 ! 424 IF( cp_cfg == 'wad' ) THEN 425 SELECT CASE ( jp_cfg ) 426 ! ! ==================== 427 CASE ( 1 ) ! WAD 1 configuration 428 ! ! ==================== 429 ! 430 IF(lwp) WRITE(numout,*) 431 IF(lwp) WRITE(numout,*) 'zgr_bat : Closed box with EW linear bottom slope' 432 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 433 ! 434 zdta = 1.5_wp 435 DO ji = 10, jpidta 436 zi = MIN(FLOAT(ji - 10)/FLOAT(jpidta - 10), 1.0 ) 437 zdta(ji,:) = MAX(rn_bathy*zi, 1.5) 438 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 439 END DO 440 !!DO ji = 1, jpidta 441 !! zi = 1.0-EXP(-0.045*(ji-25.0)**2) 442 !! zdta(ji,:) = MAX(rn_bathy*zi, 1.5) 443 !! IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 444 !!END DO 445 zdta(1:2,:) = -2._wp 446 zdta(jpidta-1:jpidta,:) = -2._wp 447 zdta(:,1) = -2._wp 448 zdta(:,jpjdta) = -2._wp 449 zdta(:,1:3) = -2._wp 450 zdta(:,jpjdta-2:jpjdta) = -2._wp 451 ! ! ==================== 452 CASE ( 2, 3 ) ! WAD 2 or 3 configuration 453 ! ! ==================== 454 ! 455 IF(lwp) WRITE(numout,*) 456 IF(lwp) WRITE(numout,*) 'zgr_bat : Parobolic EW channel' 457 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 458 ! 459 DO ji = 1, jpidta 460 zi = MAX(1.0-FLOAT((ji-25)**2)/484.0, 0.0 ) 461 zi = MAX(1.0-FLOAT((ji-25)**2)/484.0, -2.0 ) 462 zdta(ji,:) = MAX(rn_bathy*zi, -20.0) 463 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 464 END DO 465 zdta(1:2,:) = -2._wp 466 zdta(jpidta-1:jpidta,:) = -2._wp 467 zdta(:,1) = -2._wp 468 zdta(:,jpjdta) = -2._wp 469 zdta(:,1:3) = -2._wp 470 zdta(:,jpjdta-2:jpjdta) = -2._wp 471 ! ! ==================== 472 CASE ( 4 ) ! WAD 4 configuration 473 ! ! ==================== 474 ! 475 IF(lwp) WRITE(numout,*) 476 IF(lwp) WRITE(numout,*) 'zgr_bat : Parobolic bowl' 477 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 478 ! 479 DO ji = 1, jpidta 480 zi = MAX(1.0-FLOAT((ji-25)**2)/484.0, -2.0 ) 481 DO jj = 1, jpjdta 482 zj = MAX(1.0-FLOAT((jj-17)**2)/196.0, -2.0 ) 483 zdta(ji,jj) = MAX(rn_bathy*zi*zj, -2.0) 484 END DO 485 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 486 END DO 487 zdta(1:2,:) = -2._wp 488 zdta(jpidta-1:jpidta,:) = -2._wp 489 zdta(:,1) = -2._wp 490 zdta(:,jpjdta) = -2._wp 491 zdta(:,1:3) = -2._wp 492 zdta(:,jpjdta-2:jpjdta) = -2._wp 493 ! ! =========================== 494 CASE ( 5 ) ! WAD 5 configuration 495 ! ! ==================== 496 ! 497 IF(lwp) WRITE(numout,*) 498 IF(lwp) WRITE(numout,*) 'zgr_bat : Double slope with shelf' 499 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 500 ! 501 DO ji = 1, jpidta 502 zi = MIN(FLOAT(ji)/FLOAT(jpidta - 5), 1.0 ) 503 zdta(ji,:) = MAX(rn_bathy*zi, 0.5) 504 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 505 END DO 506 DO ji = jpidta,46,-1 507 zdta(ji,:) = 10.0 508 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 509 END DO 510 DO ji = 46,20,-1 511 zi = 7.5/25. 512 zdta(ji,:) = MAX(10. - zi*(47.-ji),2.5) 513 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 514 END DO 515 DO ji = 19,15,-1 516 zdta(ji,:) = 2.5 517 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 518 END DO 519 DO ji = 15,4,-1 520 zi = 2.0/11.0 521 zdta(ji,:) = MAX(2.5 - zi*(16-ji), 0.5) 522 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 523 END DO 524 DO ji = 4,1,-1 525 zdta(ji,:) = 0.5 526 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 527 END DO 528 ! ! =========================== 529 zdta(1:2,:) = -4._wp 530 zdta(jpidta-1:jpidta,:) = -4._wp 531 zdta(:,1) = -4._wp 532 zdta(:,jpjdta) = -4._wp 533 zdta(:,1:3) = -4._wp 534 zdta(:,jpjdta-2:jpjdta) = -4._wp 535 ! ! =========================== 536 CASE ( 6 ) ! WAD 6 configuration 537 ! ! ==================== 538 ! 539 IF(lwp) WRITE(numout,*) 540 IF(lwp) WRITE(numout,*) 'zgr_bat : Parabolic channel with gaussian ridge' 541 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 542 ! 543 DO ji = 1, jpidta 544 zi = MAX(1.0-FLOAT((ji-25)**2)/484.0, -2.0 ) 545 zj = 0.95*MAX(EXP(-1.0*FLOAT((ji-25)**2)/32.0) , 0.0 ) 546 zdta(ji,:) = MAX(rn_bathy*(zi-zj), -2.0) 547 IF(lwp)write(numout,*) 'ZDTA ',ji,zi,zdta(ji,1) 548 END DO 549 zdta(1:2,:) = -4._wp 550 zdta(jpidta-1:jpidta,:) = -4._wp 551 zdta(:,1) = -4._wp 552 zdta(:,jpjdta) = -4._wp 553 zdta(:,1:3) = -4._wp 554 zdta(:,jpjdta-2:jpjdta) = -4._wp 555 ! ! =========================== 556 CASE DEFAULT 557 ! ! =========================== 558 WRITE(ctmp1,*) 'WAD test with a ', jp_cfg,' option is not coded' 559 ! 560 CALL ctl_stop( ctmp1 ) 561 ! 562 END SELECT 563 END IF 564 ! 565 IF( ln_sco ) THEN ! s-coordinate (zsc ): idta()=jpk 566 idta(:,:) = jpkm1 567 ELSE ! z-coordinate (zco or zps): step-like topography 568 idta(:,:) = jpkm1 569 DO jk = 1, jpkm1 570 WHERE( gdept_1d(jk) < zdta(:,:) .AND. zdta(:,:) <= gdept_1d(jk+1) ) idta(:,:) = jk 571 END DO 572 ENDIF 573 ELSE 574 IF(lwp) WRITE(numout,*) ' Depth = depthw(jpkm1)' 575 idta(:,:) = jpkm1 ! before last level 576 zdta(:,:) = gdepw_1d(jpk) ! last w-point depth 577 h_oce = gdepw_1d(jpk) 578 ENDIF 579 ELSE ! bump centered in the basin 580 IF(lwp) WRITE(numout,*) 581 IF(lwp) WRITE(numout,*) ' bathymetry field: flat basin with a bump' 582 ii_bump = jpidta / 2 ! i-index of the bump center 583 ij_bump = jpjdta / 2 ! j-index of the bump center 584 r_bump = 50000._wp ! bump radius (meters) 585 h_bump = 2700._wp ! bump height (meters) 586 h_oce = gdepw_1d(jpk) ! background ocean depth (meters) 587 IF(lwp) WRITE(numout,*) ' bump characteristics: ' 588 IF(lwp) WRITE(numout,*) ' bump center (i,j) = ', ii_bump, ii_bump 589 IF(lwp) WRITE(numout,*) ' bump height = ', h_bump , ' meters' 590 IF(lwp) WRITE(numout,*) ' bump radius = ', r_bump , ' index' 591 IF(lwp) WRITE(numout,*) ' background ocean depth = ', h_oce , ' meters' 592 ! 593 DO jj = 1, jpjdta ! zdta : 594 DO ji = 1, jpidta 595 zi = FLOAT( ji - ii_bump ) * ppe1_m / r_bump 596 zj = FLOAT( jj - ij_bump ) * ppe2_m / r_bump 597 zdta(ji,jj) = h_oce - h_bump * EXP( -( zi*zi + zj*zj ) ) 598 END DO 599 END DO 600 ! ! idta : 601 IF( ln_sco ) THEN ! s-coordinate (zsc ): idta()=jpk 602 idta(:,:) = jpkm1 603 ELSE ! z-coordinate (zco or zps): step-like topography 604 idta(:,:) = jpkm1 605 DO jk = 1, jpkm1 606 WHERE( gdept_1d(jk) < zdta(:,:) .AND. zdta(:,:) <= gdept_1d(jk+1) ) idta(:,:) = jk 607 END DO 608 ENDIF 609 ENDIF 610 ! ! set GLOBAL boundary conditions 611 ! ! Caution : idta on the global domain: use of jperio, not nperio 612 IF( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 ) THEN 613 idta( : , 1 ) = -1 ; zdta( : , 1 ) = -1._wp 614 idta( : ,jpjdta) = 0 ; zdta( : ,jpjdta) = 0._wp 615 ELSEIF( jperio == 2 ) THEN 616 idta( : , 1 ) = idta( : , 3 ) ; zdta( : , 1 ) = zdta( : , 3 ) 617 idta( : ,jpjdta) = 0 ; zdta( : ,jpjdta) = 0._wp 618 idta( 1 , : ) = 0 ; zdta( 1 , : ) = 0._wp 619 idta(jpidta, : ) = 0 ; zdta(jpidta, : ) = 0._wp 620 ELSE 621 ih = 0 ; zh = 0._wp 622 IF( ln_sco ) ih = jpkm1 ; IF( ln_sco ) zh = h_oce 623 idta( : , 1 ) = ih ; zdta( : , 1 ) = zh 624 idta( : ,jpjdta) = ih ; zdta( : ,jpjdta) = zh 625 idta( 1 , : ) = ih ; zdta( 1 , : ) = zh 626 idta(jpidta, : ) = ih ; zdta(jpidta, : ) = zh 627 ENDIF 628 629 ! ! local domain level and meter bathymetries (mbathy,bathy) 630 mbathy(:,:) = 0 ! set to zero extra halo points 631 bathy (:,:) = 0._wp ! (require for mpp case) 632 DO jj = 1, nlcj ! interior values 633 DO ji = 1, nlci 634 mbathy(ji,jj) = idta( mig(ji), mjg(jj) ) 635 bathy (ji,jj) = zdta( mig(ji), mjg(jj) ) 636 END DO 637 END DO 638 risfdep(:,:)=0.e0 639 misfdep(:,:)=1 640 ! 641 DEALLOCATE( idta, zdta ) 642 ! 643 ! ! ================ ! 644 ELSEIF( ntopo == 1 ) THEN ! read in file ! (over the local domain) 645 ! ! ================ ! 646 ! 647 IF( ln_zco ) THEN ! zco : read level bathymetry 648 CALL iom_open ( 'bathy_level.nc', inum ) 649 CALL iom_get ( inum, jpdom_data, 'Bathy_level', bathy ) 650 CALL iom_close( inum ) 651 mbathy(:,:) = INT( bathy(:,:) ) 652 ! initialisation isf variables 653 risfdep(:,:)=0._wp ; misfdep(:,:)=1 654 ! ! ===================== 655 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN ! ORCA R2 configuration 656 ! ! ===================== 657 ! 658 ii0 = 140 ; ii1 = 140 ! Gibraltar Strait open 659 ij0 = 102 ; ij1 = 102 ! (Thomson, Ocean Modelling, 1995) 660 DO ji = mi0(ii0), mi1(ii1) 661 DO jj = mj0(ij0), mj1(ij1) 662 mbathy(ji,jj) = 15 663 END DO 664 END DO 665 IF(lwp) WRITE(numout,*) 666 IF(lwp) WRITE(numout,*) ' orca_r2: Gibraltar strait open at i=',ii0,' j=',ij0 667 ! 668 ii0 = 160 ; ii1 = 160 ! Bab el mandeb Strait open 669 ij0 = 88 ; ij1 = 88 ! (Thomson, Ocean Modelling, 1995) 670 DO ji = mi0(ii0), mi1(ii1) 671 DO jj = mj0(ij0), mj1(ij1) 672 mbathy(ji,jj) = 12 673 END DO 674 END DO 675 IF(lwp) WRITE(numout,*) 676 IF(lwp) WRITE(numout,*) ' orca_r2: Bab el Mandeb strait open at i=',ii0,' j=',ij0 677 ! 678 ENDIF 679 ! 680 ENDIF 681 IF( ln_zps .OR. ln_sco ) THEN ! zps or sco : read meter bathymetry 682 CALL iom_open ( 'bathy_meter.nc', inum ) 683 IF ( ln_isfcav ) THEN 684 CALL iom_get ( inum, jpdom_data, 'Bathymetry_isf', bathy, lrowattr=.false. ) 685 ELSE 686 CALL iom_get ( inum, jpdom_data, 'Bathymetry' , bathy, lrowattr=ln_use_jattr ) 687 END IF 688 CALL iom_close( inum ) 689 ! 690 ! initialisation isf variables 691 risfdep(:,:)=0._wp ; misfdep(:,:)=1 692 ! 693 IF ( ln_isfcav ) THEN 694 CALL iom_open ( 'isf_draft_meter.nc', inum ) 695 CALL iom_get ( inum, jpdom_data, 'isf_draft', risfdep ) 696 CALL iom_close( inum ) 697 WHERE( bathy(:,:) <= 0._wp ) risfdep(:,:) = 0._wp 698 699 ! set grounded point to 0 700 ! (a treshold could be set here if needed, or set it offline based on the grounded fraction) 701 WHERE ( bathy(:,:) <= risfdep(:,:) + rn_isfhmin ) 702 misfdep(:,:) = 0 ; risfdep(:,:) = 0._wp 703 mbathy (:,:) = 0 ; bathy (:,:) = 0._wp 704 END WHERE 705 END IF 706 ! 707 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN ! ORCA R2 configuration 708 ! 709 ii0 = 140 ; ii1 = 140 ! Gibraltar Strait open 710 ij0 = 102 ; ij1 = 102 ! (Thomson, Ocean Modelling, 1995) 711 DO ji = mi0(ii0), mi1(ii1) 712 DO jj = mj0(ij0), mj1(ij1) 713 bathy(ji,jj) = 284._wp 714 END DO 715 END DO 716 IF(lwp) WRITE(numout,*) 717 IF(lwp) WRITE(numout,*) ' orca_r2: Gibraltar strait open at i=',ii0,' j=',ij0 718 ! 719 ii0 = 160 ; ii1 = 160 ! Bab el mandeb Strait open 720 ij0 = 88 ; ij1 = 88 ! (Thomson, Ocean Modelling, 1995) 721 DO ji = mi0(ii0), mi1(ii1) 722 DO jj = mj0(ij0), mj1(ij1) 723 bathy(ji,jj) = 137._wp 724 END DO 725 END DO 726 IF(lwp) WRITE(numout,*) 727 IF(lwp) WRITE(numout,*) ' orca_r2: Bab el Mandeb strait open at i=',ii0,' j=',ij0 728 ! 729 ENDIF 730 ! 731 ENDIF 732 ! ! =============== ! 733 ELSE ! error ! 734 ! ! =============== ! 735 WRITE(ctmp1,*) 'parameter , ntopo = ', ntopo 736 CALL ctl_stop( ' zgr_bat : '//trim(ctmp1) ) 737 ENDIF 738 ! 739 IF( nn_closea == 0 ) CALL clo_bat( bathy, mbathy ) !== NO closed seas or lakes ==! 740 ! 741 IF ( .not. ln_sco ) THEN !== set a minimum depth ==! 742 IF( rn_hmin < 0._wp ) THEN ; ik = - INT( rn_hmin ) ! from a nb of level 743 ELSE ; ik = MINLOC( gdepw_1d, mask = gdepw_1d > rn_hmin, dim = 1 ) ! from a depth 744 ENDIF 745 zhmin = gdepw_1d(ik+1) ! minimum depth = ik+1 w-levels 746 WHERE( bathy(:,:) <= 0._wp ) ; bathy(:,:) = 0._wp ! min=0 over the lands 747 ELSE WHERE ; bathy(:,:) = MAX( zhmin , bathy(:,:) ) ! min=zhmin over the oceans 748 END WHERE 749 IF(lwp) write(numout,*) 'Minimum ocean depth: ', zhmin, ' minimum number of ocean levels : ', ik 750 ENDIF 751 ! 752 IF( nn_timing == 1 ) CALL timing_stop('zgr_bat') 753 ! 754 END SUBROUTINE zgr_bat 755 756 757 SUBROUTINE zgr_bat_zoom 758 !!---------------------------------------------------------------------- 759 !! *** ROUTINE zgr_bat_zoom *** 760 !! 761 !! ** Purpose : - Close zoom domain boundary if necessary 762 !! - Suppress Med Sea from ORCA R2 and R05 arctic zoom 763 !! 764 !! ** Method : 765 !! 766 !! ** Action : - update mbathy: level bathymetry (in level index) 767 !!---------------------------------------------------------------------- 768 INTEGER :: ii0, ii1, ij0, ij1 ! temporary integers 769 !!---------------------------------------------------------------------- 770 ! 771 IF(lwp) WRITE(numout,*) 772 IF(lwp) WRITE(numout,*) ' zgr_bat_zoom : modify the level bathymetry for zoom domain' 773 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~' 774 ! 775 ! Zoom domain 776 ! =========== 777 ! 778 ! Forced closed boundary if required 779 IF( lzoom_s ) mbathy( : , mj0(jpjzoom):mj1(jpjzoom) ) = 0 780 IF( lzoom_w ) mbathy( mi0(jpizoom):mi1(jpizoom) , : ) = 0 781 IF( lzoom_e ) mbathy( mi0(jpiglo+jpizoom-1):mi1(jpiglo+jpizoom-1) , : ) = 0 782 IF( lzoom_n ) mbathy( : , mj0(jpjglo+jpjzoom-1):mj1(jpjglo+jpjzoom-1) ) = 0 783 ! 784 ! Configuration specific domain modifications 785 ! (here, ORCA arctic configuration: suppress Med Sea) 786 IF( cp_cfg == "orca" .AND. cp_cfz == "arctic" ) THEN 787 SELECT CASE ( jp_cfg ) 788 ! ! ======================= 789 CASE ( 2 ) ! ORCA_R2 configuration 790 ! ! ======================= 791 IF(lwp) WRITE(numout,*) ' ORCA R2 arctic zoom: suppress the Med Sea' 792 ii0 = 141 ; ii1 = 162 ! Sea box i,j indices 793 ij0 = 98 ; ij1 = 110 794 ! ! ======================= 795 CASE ( 05 ) ! ORCA_R05 configuration 796 ! ! ======================= 797 IF(lwp) WRITE(numout,*) ' ORCA R05 arctic zoom: suppress the Med Sea' 798 ii0 = 563 ; ii1 = 642 ! zero over the Med Sea boxe 799 ij0 = 314 ; ij1 = 370 800 END SELECT 801 ! 802 mbathy( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0 ! zero over the Med Sea boxe 803 ! 804 ENDIF 805 ! 806 END SUBROUTINE zgr_bat_zoom 807 808 809 SUBROUTINE zgr_bat_ctl 810 !!---------------------------------------------------------------------- 811 !! *** ROUTINE zgr_bat_ctl *** 812 !! 813 !! ** Purpose : check the bathymetry in levels 814 !! 815 !! ** Method : The array mbathy is checked to verified its consistency 816 !! with the model options. in particular: 817 !! mbathy must have at least 1 land grid-points (mbathy<=0) 818 !! along closed boundary. 819 !! mbathy must be cyclic IF jperio=1. 820 !! mbathy must be lower or equal to jpk-1. 821 !! isolated ocean grid points are suppressed from mbathy 822 !! since they are only connected to remaining 823 !! ocean through vertical diffusion. 824 !! C A U T I O N : mbathy will be modified during the initializa- 825 !! tion phase to become the number of non-zero w-levels of a water 826 !! column, with a minimum value of 1. 827 !! 828 !! ** Action : - update mbathy: level bathymetry (in level index) 829 !! - update bathy : meter bathymetry (in meters) 830 !!---------------------------------------------------------------------- 831 INTEGER :: ji, jj, jl ! dummy loop indices 832 INTEGER :: icompt, ibtest, ikmax ! temporary integers 833 REAL(wp), POINTER, DIMENSION(:,:) :: zbathy 834 !!---------------------------------------------------------------------- 835 ! 836 IF( nn_timing == 1 ) CALL timing_start('zgr_bat_ctl') 837 ! 838 CALL wrk_alloc( jpi, jpj, zbathy ) 839 ! 840 IF(lwp) WRITE(numout,*) 841 IF(lwp) WRITE(numout,*) ' zgr_bat_ctl : check the bathymetry' 842 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~' 843 ! ! Suppress isolated ocean grid points 844 IF(lwp) WRITE(numout,*) 845 IF(lwp) WRITE(numout,*)' suppress isolated ocean grid points' 846 IF(lwp) WRITE(numout,*)' -----------------------------------' 847 icompt = 0 848 DO jl = 1, 2 849 IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN 850 mbathy( 1 ,:) = mbathy(jpim1,:) ! local domain is cyclic east-west 851 mbathy(jpi,:) = mbathy( 2 ,:) 852 ENDIF 853 DO jj = 2, jpjm1 854 DO ji = 2, jpim1 855 ibtest = MAX( mbathy(ji-1,jj), mbathy(ji+1,jj), & 856 & mbathy(ji,jj-1), mbathy(ji,jj+1) ) 857 IF( ibtest < mbathy(ji,jj) ) THEN 858 IF(lwp) WRITE(numout,*) ' the number of ocean level at ', & 859 & 'grid-point (i,j) = ',ji,jj,' is changed from ', mbathy(ji,jj),' to ', ibtest 860 mbathy(ji,jj) = ibtest 861 icompt = icompt + 1 862 ENDIF 863 END DO 864 END DO 865 END DO 866 IF( lk_mpp ) CALL mpp_sum( icompt ) 867 IF( icompt == 0 ) THEN 868 IF(lwp) WRITE(numout,*)' no isolated ocean grid points' 869 ELSE 870 IF(lwp) WRITE(numout,*)' ',icompt,' ocean grid points suppressed' 871 ENDIF 872 IF( lk_mpp ) THEN 873 zbathy(:,:) = FLOAT( mbathy(:,:) ) 874 CALL lbc_lnk( zbathy, 'T', 1._wp ) 875 mbathy(:,:) = INT( zbathy(:,:) ) 876 ENDIF 877 ! ! East-west cyclic boundary conditions 878 IF( nperio == 0 ) THEN 879 IF(lwp) WRITE(numout,*) ' mbathy set to 0 along east and west boundary: nperio = ', nperio 880 IF( lk_mpp ) THEN 881 IF( nbondi == -1 .OR. nbondi == 2 ) THEN 882 IF( jperio /= 1 ) mbathy(1,:) = 0 883 ENDIF 884 IF( nbondi == 1 .OR. nbondi == 2 ) THEN 885 IF( jperio /= 1 ) mbathy(nlci,:) = 0 886 ENDIF 887 ELSE 888 IF( ln_zco .OR. ln_zps ) THEN 889 mbathy( 1 ,:) = 0 890 mbathy(jpi,:) = 0 891 ELSE 892 mbathy( 1 ,:) = jpkm1 893 mbathy(jpi,:) = jpkm1 894 ENDIF 895 ENDIF 896 ELSEIF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN 897 IF(lwp) WRITE(numout,*)' east-west cyclic boundary conditions on mbathy: nperio = ', nperio 898 mbathy( 1 ,:) = mbathy(jpim1,:) 899 mbathy(jpi,:) = mbathy( 2 ,:) 900 ELSEIF( nperio == 2 ) THEN 901 IF(lwp) WRITE(numout,*) ' equatorial boundary conditions on mbathy: nperio = ', nperio 902 ELSE 903 IF(lwp) WRITE(numout,*) ' e r r o r' 904 IF(lwp) WRITE(numout,*) ' parameter , nperio = ', nperio 905 ! STOP 'dom_mba' 906 ENDIF 907 ! Boundary condition on mbathy 908 IF( .NOT.lk_mpp ) THEN 909 !!gm !!bug ??? think about it ! 910 ! ... mono- or macro-tasking: T-point, >0, 2D array, no slab 911 zbathy(:,:) = FLOAT( mbathy(:,:) ) 912 CALL lbc_lnk( zbathy, 'T', 1._wp ) 913 mbathy(:,:) = INT( zbathy(:,:) ) 914 ENDIF 915 ! Number of ocean level inferior or equal to jpkm1 916 ikmax = 0 917 DO jj = 1, jpj 918 DO ji = 1, jpi 919 ikmax = MAX( ikmax, mbathy(ji,jj) ) 920 END DO 921 END DO 922 !!gm !!! test to do: ikmax = MAX( mbathy(:,:) ) ??? 923 IF( ikmax > jpkm1 ) THEN 924 IF(lwp) WRITE(numout,*) ' maximum number of ocean level = ', ikmax,' > jpk-1' 925 IF(lwp) WRITE(numout,*) ' change jpk to ',ikmax+1,' to use the exact ead bathymetry' 926 ELSE IF( ikmax < jpkm1 ) THEN 927 IF(lwp) WRITE(numout,*) ' maximum number of ocean level = ', ikmax,' < jpk-1' 928 IF(lwp) WRITE(numout,*) ' you can decrease jpk to ', ikmax+1 929 ENDIF 930 ! 931 CALL wrk_dealloc( jpi, jpj, zbathy ) 932 ! 933 IF( nn_timing == 1 ) CALL timing_stop('zgr_bat_ctl') 934 ! 935 END SUBROUTINE zgr_bat_ctl 936 937 938 SUBROUTINE zgr_bot_level 939 !!---------------------------------------------------------------------- 940 !! *** ROUTINE zgr_bot_level *** 252 ! 253 ! !* ocean top and bottom level 254 CALL iom_get( inum, jpdom_data, 'top_level' , z2d , lrowattr=ln_use_jattr ) ! 1st wet T-points (ISF) 255 k_top(:,:) = INT( z2d(:,:) ) 256 CALL iom_get( inum, jpdom_data, 'bottom_level' , z2d , lrowattr=ln_use_jattr ) ! last wet T-points 257 k_bot(:,:) = INT( z2d(:,:) ) 258 ! 259 CALL iom_close( inum ) 260 ! 261 END SUBROUTINE zgr_read 262 263 264 SUBROUTINE zgr_top_bot( k_top, k_bot ) 265 !!---------------------------------------------------------------------- 266 !! *** ROUTINE zgr_top_bot *** 941 267 !! 942 268 !! ** Purpose : defines the vertical index of ocean bottom (mbk. arrays) 943 269 !! 944 !! ** Method : computes from mbathy with a minimum value of 1 over land 945 !! 270 !! ** Method : computes from k_top and k_bot with a minimum value of 1 over land 271 !! 272 !! ** Action : mikt, miku, mikv : vertical indices of the shallowest 273 !! ocean level at t-, u- & v-points 274 !! (min value = 1) 946 275 !! ** Action : mbkt, mbku, mbkv : vertical indices of the deeptest 947 276 !! ocean level at t-, u- & v-points 948 277 !! (min value = 1 over land) 949 278 !!---------------------------------------------------------------------- 279 INTEGER , DIMENSION(:,:), INTENT(in) :: k_top, k_bot ! top & bottom ocean level indices 280 ! 950 281 INTEGER :: ji, jj ! dummy loop indices 951 REAL(wp), POINTER, DIMENSION(:,:) :: z mbk952 !!---------------------------------------------------------------------- 953 ! 954 IF( nn_timing == 1 ) CALL timing_start('zgr_ bot_level')955 ! 956 CALL wrk_alloc( jpi, jpj, zmbk )282 REAL(wp), POINTER, DIMENSION(:,:) :: zk 283 !!---------------------------------------------------------------------- 284 ! 285 IF( nn_timing == 1 ) CALL timing_start('zgr_top_bot') 286 ! 287 CALL wrk_alloc( jpi,jpj, zk ) 957 288 ! 958 289 IF(lwp) WRITE(numout,*) 959 IF(lwp) WRITE(numout,*) ' zgr_bot_level : ocean bottom k-index of T-, U-, V- and W-levels ' 960 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~' 961 ! 962 mbkt(:,:) = MAX( mbathy(:,:) , 1 ) ! bottom k-index of T-level (=1 over land) 290 IF(lwp) WRITE(numout,*) ' zgr_top_bot : ocean top and bottom k-index of T-, U-, V- and W-levels ' 291 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~' 292 ! 293 mikt(:,:) = MAX( k_top(:,:) , 1 ) ! top ocean k-index of T-level (=1 over land) 294 ! 295 mbkt(:,:) = MAX( k_bot(:,:) , 1 ) ! bottom ocean k-index of T-level (=1 over land) 963 296 964 ! ! bottom k-index of W-level = mbkt+1 965 DO jj = 1, jpjm1 ! bottom k-index of u- (v-) level 297 ! ! N.B. top k-index of W-level = mikt 298 ! ! bottom k-index of W-level = mbkt+1 299 DO jj = 1, jpjm1 966 300 DO ji = 1, jpim1 301 miku(ji,jj) = MAX( mikt(ji+1,jj ) , mikt(ji,jj) ) 302 mikv(ji,jj) = MAX( mikt(ji ,jj+1) , mikt(ji,jj) ) 303 mikf(ji,jj) = MAX( mikt(ji ,jj+1) , mikt(ji,jj), mikt(ji+1,jj ), mikt(ji+1,jj+1) ) 304 ! 967 305 mbku(ji,jj) = MIN( mbkt(ji+1,jj ) , mbkt(ji,jj) ) 968 306 mbkv(ji,jj) = MIN( mbkt(ji ,jj+1) , mbkt(ji,jj) ) … … 970 308 END DO 971 309 ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 972 zmbk(:,:) = REAL( mbku(:,:), wp ) ; CALL lbc_lnk(zmbk,'U',1.) ; mbku (:,:) = MAX( INT( zmbk(:,:) ), 1 ) 973 zmbk(:,:) = REAL( mbkv(:,:), wp ) ; CALL lbc_lnk(zmbk,'V',1.) ; mbkv (:,:) = MAX( INT( zmbk(:,:) ), 1 ) 974 ! 975 CALL wrk_dealloc( jpi, jpj, zmbk ) 976 ! 977 IF( nn_timing == 1 ) CALL timing_stop('zgr_bot_level') 978 ! 979 END SUBROUTINE zgr_bot_level 980 981 982 SUBROUTINE zgr_top_level 983 !!---------------------------------------------------------------------- 984 !! *** ROUTINE zgr_top_level *** 985 !! 986 !! ** Purpose : defines the vertical index of ocean top (mik. arrays) 987 !! 988 !! ** Method : computes from misfdep with a minimum value of 1 989 !! 990 !! ** Action : mikt, miku, mikv : vertical indices of the shallowest 991 !! ocean level at t-, u- & v-points 992 !! (min value = 1) 993 !!---------------------------------------------------------------------- 994 INTEGER :: ji, jj ! dummy loop indices 995 REAL(wp), POINTER, DIMENSION(:,:) :: zmik 996 !!---------------------------------------------------------------------- 997 ! 998 IF( nn_timing == 1 ) CALL timing_start('zgr_top_level') 999 ! 1000 CALL wrk_alloc( jpi, jpj, zmik ) 1001 ! 1002 IF(lwp) WRITE(numout,*) 1003 IF(lwp) WRITE(numout,*) ' zgr_top_level : ocean top k-index of T-, U-, V- and W-levels ' 1004 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~' 1005 ! 1006 mikt(:,:) = MAX( misfdep(:,:) , 1 ) ! top k-index of T-level (=1) 1007 ! ! top k-index of W-level (=mikt) 1008 DO jj = 1, jpjm1 ! top k-index of U- (U-) level 1009 DO ji = 1, jpim1 1010 miku(ji,jj) = MAX( mikt(ji+1,jj ) , mikt(ji,jj) ) 1011 mikv(ji,jj) = MAX( mikt(ji ,jj+1) , mikt(ji,jj) ) 1012 mikf(ji,jj) = MAX( mikt(ji ,jj+1) , mikt(ji,jj), mikt(ji+1,jj ), mikt(ji+1,jj+1) ) 1013 END DO 1014 END DO 1015 1016 ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 1017 zmik(:,:) = REAL( miku(:,:), wp ) ; CALL lbc_lnk(zmik,'U',1.) ; miku (:,:) = MAX( INT( zmik(:,:) ), 1 ) 1018 zmik(:,:) = REAL( mikv(:,:), wp ) ; CALL lbc_lnk(zmik,'V',1.) ; mikv (:,:) = MAX( INT( zmik(:,:) ), 1 ) 1019 zmik(:,:) = REAL( mikf(:,:), wp ) ; CALL lbc_lnk(zmik,'F',1.) ; mikf (:,:) = MAX( INT( zmik(:,:) ), 1 ) 1020 ! 1021 CALL wrk_dealloc( jpi, jpj, zmik ) 1022 ! 1023 IF( nn_timing == 1 ) CALL timing_stop('zgr_top_level') 1024 ! 1025 END SUBROUTINE zgr_top_level 1026 1027 1028 SUBROUTINE zgr_zco 1029 !!---------------------------------------------------------------------- 1030 !! *** ROUTINE zgr_zco *** 1031 !! 1032 !! ** Purpose : define the reference z-coordinate system 1033 !! 1034 !! ** Method : set 3D coord. arrays to reference 1D array 1035 !!---------------------------------------------------------------------- 1036 INTEGER :: jk 1037 !!---------------------------------------------------------------------- 1038 ! 1039 IF( nn_timing == 1 ) CALL timing_start('zgr_zco') 1040 ! 1041 DO jk = 1, jpk 1042 gdept_0(:,:,jk) = gdept_1d(jk) 1043 gdepw_0(:,:,jk) = gdepw_1d(jk) 1044 gde3w_0(:,:,jk) = gdepw_1d(jk) 1045 e3t_0 (:,:,jk) = e3t_1d (jk) 1046 e3u_0 (:,:,jk) = e3t_1d (jk) 1047 e3v_0 (:,:,jk) = e3t_1d (jk) 1048 e3f_0 (:,:,jk) = e3t_1d (jk) 1049 e3w_0 (:,:,jk) = e3w_1d (jk) 1050 e3uw_0 (:,:,jk) = e3w_1d (jk) 1051 e3vw_0 (:,:,jk) = e3w_1d (jk) 1052 END DO 1053 ! 1054 IF( nn_timing == 1 ) CALL timing_stop('zgr_zco') 1055 ! 1056 END SUBROUTINE zgr_zco 1057 1058 1059 SUBROUTINE zgr_zps 1060 !!---------------------------------------------------------------------- 1061 !! *** ROUTINE zgr_zps *** 1062 !! 1063 !! ** Purpose : the depth and vertical scale factor in partial step 1064 !! reference z-coordinate case 1065 !! 1066 !! ** Method : Partial steps : computes the 3D vertical scale factors 1067 !! of T-, U-, V-, W-, UW-, VW and F-points that are associated with 1068 !! a partial step representation of bottom topography. 1069 !! 1070 !! The reference depth of model levels is defined from an analytical 1071 !! function the derivative of which gives the reference vertical 1072 !! scale factors. 1073 !! From depth and scale factors reference, we compute there new value 1074 !! with partial steps on 3d arrays ( i, j, k ). 1075 !! 1076 !! w-level: gdepw_0(i,j,k) = gdep(k) 1077 !! e3w_0(i,j,k) = dk(gdep)(k) = e3(i,j,k) 1078 !! t-level: gdept_0(i,j,k) = gdep(k+0.5) 1079 !! e3t_0(i,j,k) = dk(gdep)(k+0.5) = e3(i,j,k+0.5) 1080 !! 1081 !! With the help of the bathymetric file ( bathymetry_depth_ORCA_R2.nc), 1082 !! we find the mbathy index of the depth at each grid point. 1083 !! This leads us to three cases: 1084 !! 1085 !! - bathy = 0 => mbathy = 0 1086 !! - 1 < mbathy < jpkm1 1087 !! - bathy > gdepw_0(jpk) => mbathy = jpkm1 1088 !! 1089 !! Then, for each case, we find the new depth at t- and w- levels 1090 !! and the new vertical scale factors at t-, u-, v-, w-, uw-, vw- 1091 !! and f-points. 1092 !! 1093 !! This routine is given as an example, it must be modified 1094 !! following the user s desiderata. nevertheless, the output as 1095 !! well as the way to compute the model levels and scale factors 1096 !! must be respected in order to insure second order accuracy 1097 !! schemes. 1098 !! 1099 !! c a u t i o n : gdept_1d, gdepw_1d and e3._1d are positives 1100 !! - - - - - - - gdept_0, gdepw_0 and e3. are positives 1101 !! 1102 !! Reference : Pacanowsky & Gnanadesikan 1997, Mon. Wea. Rev., 126, 3248-3270. 1103 !!---------------------------------------------------------------------- 1104 INTEGER :: ji, jj, jk ! dummy loop indices 1105 INTEGER :: ik, it, ikb, ikt ! temporary integers 1106 REAL(wp) :: ze3tp , ze3wp ! Last ocean level thickness at T- and W-points 1107 REAL(wp) :: zdepwp, zdepth ! Ajusted ocean depth to avoid too small e3t 1108 REAL(wp) :: zdiff ! temporary scalar 1109 REAL(wp) :: zmax ! temporary scalar 1110 REAL(wp), POINTER, DIMENSION(:,:,:) :: zprt 1111 !!--------------------------------------------------------------------- 1112 ! 1113 IF( nn_timing == 1 ) CALL timing_start('zgr_zps') 1114 ! 1115 CALL wrk_alloc( jpi,jpj,jpk, zprt ) 1116 ! 1117 IF(lwp) WRITE(numout,*) 1118 IF(lwp) WRITE(numout,*) ' zgr_zps : z-coordinate with partial steps' 1119 IF(lwp) WRITE(numout,*) ' ~~~~~~~ ' 1120 IF(lwp) WRITE(numout,*) ' mbathy is recomputed : bathy_level file is NOT used' 1121 1122 ! bathymetry in level (from bathy_meter) 1123 ! =================== 1124 zmax = gdepw_1d(jpk) + e3t_1d(jpk) ! maximum depth (i.e. the last ocean level thickness <= 2*e3t_1d(jpkm1) ) 1125 bathy(:,:) = MIN( zmax , bathy(:,:) ) ! bounded value of bathy (min already set at the end of zgr_bat) 1126 WHERE( bathy(:,:) == 0._wp ) ; mbathy(:,:) = 0 ! land : set mbathy to 0 1127 ELSE WHERE ; mbathy(:,:) = jpkm1 ! ocean : initialize mbathy to the max ocean level 1128 END WHERE 1129 1130 ! Compute mbathy for ocean points (i.e. the number of ocean levels) 1131 ! find the number of ocean levels such that the last level thickness 1132 ! is larger than the minimum of e3zps_min and e3zps_rat * e3t_1d (where 1133 ! e3t_1d is the reference level thickness 1134 DO jk = jpkm1, 1, -1 1135 zdepth = gdepw_1d(jk) + MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 1136 WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth ) mbathy(:,:) = jk-1 1137 END DO 1138 1139 ! Scale factors and depth at T- and W-points 1140 DO jk = 1, jpk ! intitialization to the reference z-coordinate 1141 gdept_0(:,:,jk) = gdept_1d(jk) 1142 gdepw_0(:,:,jk) = gdepw_1d(jk) 1143 e3t_0 (:,:,jk) = e3t_1d (jk) 1144 e3w_0 (:,:,jk) = e3w_1d (jk) 1145 END DO 1146 1147 ! Bathy, iceshelf draft, scale factor and depth at T- and W- points in case of isf 1148 IF ( ln_isfcav ) CALL zgr_isf 1149 1150 ! Scale factors and depth at T- and W-points 1151 IF ( .NOT. ln_isfcav ) THEN 1152 DO jj = 1, jpj 1153 DO ji = 1, jpi 1154 ik = mbathy(ji,jj) 1155 IF( ik > 0 ) THEN ! ocean point only 1156 ! max ocean level case 1157 IF( ik == jpkm1 ) THEN 1158 zdepwp = bathy(ji,jj) 1159 ze3tp = bathy(ji,jj) - gdepw_1d(ik) 1160 ze3wp = 0.5_wp * e3w_1d(ik) * ( 1._wp + ( ze3tp/e3t_1d(ik) ) ) 1161 e3t_0(ji,jj,ik ) = ze3tp 1162 e3t_0(ji,jj,ik+1) = ze3tp 1163 e3w_0(ji,jj,ik ) = ze3wp 1164 e3w_0(ji,jj,ik+1) = ze3tp 1165 gdepw_0(ji,jj,ik+1) = zdepwp 1166 gdept_0(ji,jj,ik ) = gdept_1d(ik-1) + ze3wp 1167 gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + ze3tp 1168 ! 1169 ELSE ! standard case 1170 IF( bathy(ji,jj) <= gdepw_1d(ik+1) ) THEN ; gdepw_0(ji,jj,ik+1) = bathy(ji,jj) 1171 ELSE ; gdepw_0(ji,jj,ik+1) = gdepw_1d(ik+1) 1172 ENDIF 1173 !gm Bug? check the gdepw_1d 1174 ! ... on ik 1175 gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0(ji,jj,ik+1) - gdepw_1d(ik) ) & 1176 & * ((gdept_1d( ik ) - gdepw_1d(ik) ) & 1177 & / ( gdepw_1d( ik+1) - gdepw_1d(ik) )) 1178 e3t_0 (ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) ) & 1179 & / ( gdepw_1d( ik+1) - gdepw_1d(ik) ) 1180 e3w_0(ji,jj,ik) = 0.5_wp * ( gdepw_0(ji,jj,ik+1) + gdepw_1d(ik+1) - 2._wp * gdepw_1d(ik) ) & 1181 & * ( e3w_1d(ik) / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) ) 1182 ! ... on ik+1 1183 e3w_0 (ji,jj,ik+1) = e3t_0 (ji,jj,ik) 1184 e3t_0 (ji,jj,ik+1) = e3t_0 (ji,jj,ik) 1185 gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + e3t_0(ji,jj,ik) 1186 ENDIF 1187 ENDIF 1188 END DO 1189 END DO 1190 ! 1191 it = 0 1192 DO jj = 1, jpj 1193 DO ji = 1, jpi 1194 ik = mbathy(ji,jj) 1195 IF( ik > 0 ) THEN ! ocean point only 1196 e3tp (ji,jj) = e3t_0(ji,jj,ik) 1197 e3wp (ji,jj) = e3w_0(ji,jj,ik) 1198 ! test 1199 zdiff= gdepw_0(ji,jj,ik+1) - gdept_0(ji,jj,ik ) 1200 IF( zdiff <= 0._wp .AND. lwp ) THEN 1201 it = it + 1 1202 WRITE(numout,*) ' it = ', it, ' ik = ', ik, ' (i,j) = ', ji, jj 1203 WRITE(numout,*) ' bathy = ', bathy(ji,jj) 1204 WRITE(numout,*) ' gdept_0 = ', gdept_0(ji,jj,ik), ' gdepw_0 = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff 1205 WRITE(numout,*) ' e3tp = ', e3t_0 (ji,jj,ik), ' e3wp = ', e3w_0 (ji,jj,ik ) 1206 ENDIF 1207 ENDIF 1208 END DO 1209 END DO 1210 END IF 1211 ! 1212 ! Scale factors and depth at U-, V-, UW and VW-points 1213 DO jk = 1, jpk ! initialisation to z-scale factors 1214 e3u_0 (:,:,jk) = e3t_1d(jk) 1215 e3v_0 (:,:,jk) = e3t_1d(jk) 1216 e3uw_0(:,:,jk) = e3w_1d(jk) 1217 e3vw_0(:,:,jk) = e3w_1d(jk) 1218 END DO 1219 1220 DO jk = 1,jpk ! Computed as the minimum of neighbooring scale factors 1221 DO jj = 1, jpjm1 1222 DO ji = 1, fs_jpim1 ! vector opt. 1223 e3u_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji+1,jj,jk) ) 1224 e3v_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji,jj+1,jk) ) 1225 e3uw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji+1,jj,jk) ) 1226 e3vw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji,jj+1,jk) ) 1227 END DO 1228 END DO 1229 END DO 1230 IF ( ln_isfcav ) THEN 1231 ! (ISF) define e3uw (adapted for 2 cells in the water column) 1232 DO jj = 2, jpjm1 1233 DO ji = 2, fs_jpim1 ! vector opt. 1234 ikb = MAX(mbathy (ji,jj),mbathy (ji+1,jj)) 1235 ikt = MAX(misfdep(ji,jj),misfdep(ji+1,jj)) 1236 IF (ikb == ikt+1) e3uw_0(ji,jj,ikb) = MIN( gdept_0(ji,jj,ikb ), gdept_0(ji+1,jj ,ikb ) ) & 1237 & - MAX( gdept_0(ji,jj,ikb-1), gdept_0(ji+1,jj ,ikb-1) ) 1238 ikb = MAX(mbathy (ji,jj),mbathy (ji,jj+1)) 1239 ikt = MAX(misfdep(ji,jj),misfdep(ji,jj+1)) 1240 IF (ikb == ikt+1) e3vw_0(ji,jj,ikb) = MIN( gdept_0(ji,jj,ikb ), gdept_0(ji ,jj+1,ikb ) ) & 1241 & - MAX( gdept_0(ji,jj,ikb-1), gdept_0(ji ,jj+1,ikb-1) ) 1242 END DO 1243 END DO 1244 END IF 1245 1246 CALL lbc_lnk( e3u_0 , 'U', 1._wp ) ; CALL lbc_lnk( e3uw_0, 'U', 1._wp ) ! lateral boundary conditions 1247 CALL lbc_lnk( e3v_0 , 'V', 1._wp ) ; CALL lbc_lnk( e3vw_0, 'V', 1._wp ) 1248 ! 1249 1250 DO jk = 1, jpk ! set to z-scale factor if zero (i.e. along closed boundaries) 1251 WHERE( e3u_0 (:,:,jk) == 0._wp ) e3u_0 (:,:,jk) = e3t_1d(jk) 1252 WHERE( e3v_0 (:,:,jk) == 0._wp ) e3v_0 (:,:,jk) = e3t_1d(jk) 1253 WHERE( e3uw_0(:,:,jk) == 0._wp ) e3uw_0(:,:,jk) = e3w_1d(jk) 1254 WHERE( e3vw_0(:,:,jk) == 0._wp ) e3vw_0(:,:,jk) = e3w_1d(jk) 1255 END DO 1256 1257 ! Scale factor at F-point 1258 DO jk = 1, jpk ! initialisation to z-scale factors 1259 e3f_0(:,:,jk) = e3t_1d(jk) 1260 END DO 1261 DO jk = 1, jpk ! Computed as the minimum of neighbooring V-scale factors 1262 DO jj = 1, jpjm1 1263 DO ji = 1, fs_jpim1 ! vector opt. 1264 e3f_0(ji,jj,jk) = MIN( e3v_0(ji,jj,jk), e3v_0(ji+1,jj,jk) ) 1265 END DO 1266 END DO 1267 END DO 1268 CALL lbc_lnk( e3f_0, 'F', 1._wp ) ! Lateral boundary conditions 1269 ! 1270 DO jk = 1, jpk ! set to z-scale factor if zero (i.e. along closed boundaries) 1271 WHERE( e3f_0(:,:,jk) == 0._wp ) e3f_0(:,:,jk) = e3t_1d(jk) 1272 END DO 1273 !!gm bug ? : must be a do loop with mj0,mj1 1274 ! 1275 e3t_0(:,mj0(1),:) = e3t_0(:,mj0(2),:) ! we duplicate factor scales for jj = 1 and jj = 2 1276 e3w_0(:,mj0(1),:) = e3w_0(:,mj0(2),:) 1277 e3u_0(:,mj0(1),:) = e3u_0(:,mj0(2),:) 1278 e3v_0(:,mj0(1),:) = e3v_0(:,mj0(2),:) 1279 e3f_0(:,mj0(1),:) = e3f_0(:,mj0(2),:) 1280 1281 ! Control of the sign 1282 IF( MINVAL( e3t_0 (:,:,:) ) <= 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r e3t_0 <= 0' ) 1283 IF( MINVAL( e3w_0 (:,:,:) ) <= 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r e3w_0 <= 0' ) 1284 IF( MINVAL( gdept_0(:,:,:) ) < 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r gdept_0 < 0' ) 1285 IF( MINVAL( gdepw_0(:,:,:) ) < 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r gdepw_0 < 0' ) 1286 1287 ! Compute gde3w_0 (vertical sum of e3w) 1288 IF ( ln_isfcav ) THEN ! if cavity 1289 WHERE( misfdep == 0 ) misfdep = 1 1290 DO jj = 1,jpj 1291 DO ji = 1,jpi 1292 gde3w_0(ji,jj,1) = 0.5_wp * e3w_0(ji,jj,1) 1293 DO jk = 2, misfdep(ji,jj) 1294 gde3w_0(ji,jj,jk) = gde3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk) 1295 END DO 1296 IF( misfdep(ji,jj) >= 2 ) gde3w_0(ji,jj,misfdep(ji,jj)) = risfdep(ji,jj) + 0.5_wp * e3w_0(ji,jj,misfdep(ji,jj)) 1297 DO jk = misfdep(ji,jj) + 1, jpk 1298 gde3w_0(ji,jj,jk) = gde3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk) 1299 END DO 1300 END DO 1301 END DO 1302 ELSE ! no cavity 1303 gde3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 1304 DO jk = 2, jpk 1305 gde3w_0(:,:,jk) = gde3w_0(:,:,jk-1) + e3w_0(:,:,jk) 1306 END DO 1307 END IF 1308 ! 1309 CALL wrk_dealloc( jpi,jpj,jpk, zprt ) 1310 ! 1311 IF( nn_timing == 1 ) CALL timing_stop('zgr_zps') 1312 ! 1313 END SUBROUTINE zgr_zps 1314 1315 1316 SUBROUTINE zgr_isf 1317 !!---------------------------------------------------------------------- 1318 !! *** ROUTINE zgr_isf *** 1319 !! 1320 !! ** Purpose : check the bathymetry in levels 1321 !! 1322 !! ** Method : THe water column have to contained at least 2 cells 1323 !! Bathymetry and isfdraft are modified (dig/close) to respect 1324 !! this criterion. 1325 !! 1326 !! ** Action : - test compatibility between isfdraft and bathy 1327 !! - bathy and isfdraft are modified 1328 !!---------------------------------------------------------------------- 1329 INTEGER :: ji, jj, jl, jk ! dummy loop indices 1330 INTEGER :: ik, it ! temporary integers 1331 INTEGER :: icompt, ibtest ! (ISF) 1332 INTEGER :: ibtestim1, ibtestip1 ! (ISF) 1333 INTEGER :: ibtestjm1, ibtestjp1 ! (ISF) 1334 REAL(wp) :: zdepth ! Ajusted ocean depth to avoid too small e3t 1335 REAL(wp) :: zmax ! Maximum and minimum depth 1336 REAL(wp) :: zbathydiff ! isf temporary scalar 1337 REAL(wp) :: zrisfdepdiff ! isf temporary scalar 1338 REAL(wp) :: ze3tp , ze3wp ! Last ocean level thickness at T- and W-points 1339 REAL(wp) :: zdepwp ! Ajusted ocean depth to avoid too small e3t 1340 REAL(wp) :: zdiff ! temporary scalar 1341 REAL(wp), POINTER, DIMENSION(:,:) :: zrisfdep, zbathy, zmask ! 2D workspace (ISH) 1342 INTEGER , POINTER, DIMENSION(:,:) :: zmbathy, zmisfdep ! 2D workspace (ISH) 1343 !!--------------------------------------------------------------------- 1344 ! 1345 IF( nn_timing == 1 ) CALL timing_start('zgr_isf') 1346 ! 1347 CALL wrk_alloc( jpi,jpj, zbathy, zmask, zrisfdep) 1348 CALL wrk_alloc( jpi,jpj, zmisfdep, zmbathy ) 1349 1350 ! (ISF) compute misfdep 1351 WHERE( risfdep(:,:) == 0._wp .AND. bathy(:,:) /= 0 ) ; misfdep(:,:) = 1 ! open water : set misfdep to 1 1352 ELSEWHERE ; misfdep(:,:) = 2 ! iceshelf : initialize misfdep to second level 1353 END WHERE 1354 1355 ! Compute misfdep for ocean points (i.e. first wet level) 1356 ! find the first ocean level such that the first level thickness 1357 ! is larger than the bot_level of e3zps_min and e3zps_rat * e3t_0 (where 1358 ! e3t_0 is the reference level thickness 1359 DO jk = 2, jpkm1 1360 zdepth = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 1361 WHERE( 0._wp < risfdep(:,:) .AND. risfdep(:,:) >= zdepth ) misfdep(:,:) = jk+1 1362 END DO 1363 WHERE ( 0._wp < risfdep(:,:) .AND. risfdep(:,:) <= e3t_1d(1) ) 1364 risfdep(:,:) = 0. ; misfdep(:,:) = 1 1365 END WHERE 1366 1367 ! remove very shallow ice shelf (less than ~ 10m if 75L) 1368 WHERE (risfdep(:,:) <= 10._wp .AND. misfdep(:,:) > 1) 1369 misfdep = 0; risfdep = 0.0_wp; 1370 mbathy = 0; bathy = 0.0_wp; 1371 END WHERE 1372 WHERE (bathy(:,:) <= 30.0_wp .AND. gphit < -60._wp) 1373 misfdep = 0; risfdep = 0.0_wp; 1374 mbathy = 0; bathy = 0.0_wp; 1375 END WHERE 1376 1377 ! basic check for the compatibility of bathy and risfdep. I think it should be offline because it is not perfect and cannot solved all the situation 1378 icompt = 0 1379 ! run the bathy check 10 times to be sure all the modif in the bathy or iceshelf draft are compatible together 1380 DO jl = 1, 10 1381 ! check at each iteration if isf is grounded or not (1cm treshold have to be update after first coupling experiments) 1382 WHERE (bathy(:,:) <= risfdep(:,:) + rn_isfhmin) 1383 misfdep(:,:) = 0 ; risfdep(:,:) = 0._wp 1384 mbathy (:,:) = 0 ; bathy (:,:) = 0._wp 1385 END WHERE 1386 WHERE (mbathy(:,:) <= 0) 1387 misfdep(:,:) = 0; risfdep(:,:) = 0._wp 1388 mbathy (:,:) = 0; bathy (:,:) = 0._wp 1389 END WHERE 1390 IF( lk_mpp ) THEN 1391 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1392 CALL lbc_lnk( zbathy, 'T', 1. ) 1393 misfdep(:,:) = INT( zbathy(:,:) ) 1394 1395 CALL lbc_lnk( risfdep,'T', 1. ) 1396 CALL lbc_lnk( bathy, 'T', 1. ) 1397 1398 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1399 CALL lbc_lnk( zbathy, 'T', 1. ) 1400 mbathy(:,:) = INT( zbathy(:,:) ) 1401 ENDIF 1402 IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN 1403 misfdep( 1 ,:) = misfdep(jpim1,:) ! local domain is cyclic east-west 1404 misfdep(jpi,:) = misfdep( 2 ,:) 1405 mbathy( 1 ,:) = mbathy(jpim1,:) ! local domain is cyclic east-west 1406 mbathy(jpi,:) = mbathy( 2 ,:) 1407 ENDIF 1408 1409 ! split last cell if possible (only where water column is 2 cell or less) 1410 ! if coupled to ice sheet, we do not modify the bathymetry (can be discuss). 1411 IF ( .NOT. ln_iscpl) THEN 1412 DO jk = jpkm1, 1, -1 1413 zmax = gdepw_1d(jk) + MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 1414 WHERE( gdepw_1d(jk) < bathy(:,:) .AND. bathy(:,:) <= zmax .AND. misfdep + 1 >= mbathy) 1415 mbathy(:,:) = jk 1416 bathy(:,:) = zmax 1417 END WHERE 1418 END DO 1419 END IF 1420 1421 ! split top cell if possible (only where water column is 2 cell or less) 1422 DO jk = 2, jpkm1 1423 zmax = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 1424 WHERE( gdepw_1d(jk+1) > risfdep(:,:) .AND. risfdep(:,:) >= zmax .AND. misfdep + 1 >= mbathy) 1425 misfdep(:,:) = jk 1426 risfdep(:,:) = zmax 1427 END WHERE 1428 END DO 1429 1430 1431 ! Case where bathy and risfdep compatible but not the level variable mbathy/misfdep because of partial cell condition 1432 DO jj = 1, jpj 1433 DO ji = 1, jpi 1434 ! find the minimum change option: 1435 ! test bathy 1436 IF (risfdep(ji,jj) > 1) THEN 1437 IF ( .NOT. ln_iscpl ) THEN 1438 zbathydiff =ABS(bathy(ji,jj) - (gdepw_1d(mbathy (ji,jj)+1) & 1439 & + MIN( e3zps_min, e3t_1d(mbathy (ji,jj)+1)*e3zps_rat ))) 1440 zrisfdepdiff=ABS(risfdep(ji,jj) - (gdepw_1d(misfdep(ji,jj) ) & 1441 & - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ))) 1442 IF (bathy(ji,jj) > risfdep(ji,jj) .AND. mbathy(ji,jj) < misfdep(ji,jj)) THEN 1443 IF (zbathydiff <= zrisfdepdiff) THEN 1444 bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj)+1)*e3zps_rat ) 1445 mbathy(ji,jj)= mbathy(ji,jj) + 1 1446 ELSE 1447 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ) 1448 misfdep(ji,jj) = misfdep(ji,jj) - 1 1449 END IF 1450 ENDIF 1451 ELSE 1452 IF (bathy(ji,jj) > risfdep(ji,jj) .AND. mbathy(ji,jj) < misfdep(ji,jj)) THEN 1453 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ) 1454 misfdep(ji,jj) = misfdep(ji,jj) - 1 1455 END IF 1456 END IF 1457 END IF 1458 END DO 1459 END DO 1460 1461 ! At least 2 levels for water thickness at T, U, and V point. 1462 DO jj = 1, jpj 1463 DO ji = 1, jpi 1464 ! find the minimum change option: 1465 ! test bathy 1466 IF( misfdep(ji,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) > 1) THEN 1467 IF ( .NOT. ln_iscpl ) THEN 1468 zbathydiff =ABS(bathy(ji,jj) - ( gdepw_1d(mbathy (ji,jj)+1) & 1469 & + MIN( e3zps_min,e3t_1d(mbathy (ji,jj)+1)*e3zps_rat ))) 1470 zrisfdepdiff=ABS(risfdep(ji,jj) - ( gdepw_1d(misfdep(ji,jj) ) & 1471 & - MIN( e3zps_min,e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ))) 1472 IF (zbathydiff <= zrisfdepdiff) THEN 1473 mbathy(ji,jj) = mbathy(ji,jj) + 1 1474 bathy(ji,jj) = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat ) 1475 ELSE 1476 misfdep(ji,jj)= misfdep(ji,jj) - 1 1477 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj))*e3zps_rat ) 1478 END IF 1479 ELSE 1480 misfdep(ji,jj)= misfdep(ji,jj) - 1 1481 risfdep(ji,jj)= gdepw_1d(misfdep(ji,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj))*e3zps_rat ) 1482 END IF 1483 ENDIF 1484 END DO 1485 END DO 1486 1487 ! point V mbathy(ji,jj) == misfdep(ji,jj+1) 1488 DO jj = 1, jpjm1 1489 DO ji = 1, jpim1 1490 IF( misfdep(ji,jj+1) == mbathy(ji,jj) .AND. mbathy(ji,jj) > 1) THEN 1491 IF ( .NOT. ln_iscpl ) THEN 1492 zbathydiff =ABS(bathy(ji,jj ) - ( gdepw_1d(mbathy (ji,jj)+1) & 1493 & + MIN( e3zps_min, e3t_1d(mbathy (ji,jj )+1)*e3zps_rat ))) 1494 zrisfdepdiff=ABS(risfdep(ji,jj+1) - ( gdepw_1d(misfdep(ji,jj+1)) & 1495 & - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1)-1)*e3zps_rat ))) 1496 IF (zbathydiff <= zrisfdepdiff) THEN 1497 mbathy(ji,jj) = mbathy(ji,jj) + 1 1498 bathy(ji,jj) = gdepw_1d(mbathy (ji,jj )) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj )+1)*e3zps_rat ) 1499 ELSE 1500 misfdep(ji,jj+1) = misfdep(ji,jj+1) - 1 1501 risfdep (ji,jj+1) = gdepw_1d(misfdep(ji,jj+1)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1))*e3zps_rat ) 1502 END IF 1503 ELSE 1504 misfdep(ji,jj+1) = misfdep(ji,jj+1) - 1 1505 risfdep (ji,jj+1) = gdepw_1d(misfdep(ji,jj+1)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1))*e3zps_rat ) 1506 END IF 1507 ENDIF 1508 END DO 1509 END DO 1510 1511 IF( lk_mpp ) THEN 1512 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1513 CALL lbc_lnk( zbathy, 'T', 1. ) 1514 misfdep(:,:) = INT( zbathy(:,:) ) 1515 1516 CALL lbc_lnk( risfdep,'T', 1. ) 1517 CALL lbc_lnk( bathy, 'T', 1. ) 1518 1519 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1520 CALL lbc_lnk( zbathy, 'T', 1. ) 1521 mbathy(:,:) = INT( zbathy(:,:) ) 1522 ENDIF 1523 ! point V misdep(ji,jj) == mbathy(ji,jj+1) 1524 DO jj = 1, jpjm1 1525 DO ji = 1, jpim1 1526 IF( misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) > 1) THEN 1527 IF ( .NOT. ln_iscpl ) THEN 1528 zbathydiff =ABS( bathy(ji,jj+1) - ( gdepw_1d(mbathy (ji,jj+1)+1) & 1529 & + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat ))) 1530 zrisfdepdiff=ABS(risfdep(ji,jj ) - ( gdepw_1d(misfdep(ji,jj ) ) & 1531 & - MIN( e3zps_min, e3t_1d(misfdep(ji,jj )-1)*e3zps_rat ))) 1532 IF (zbathydiff <= zrisfdepdiff) THEN 1533 mbathy (ji,jj+1) = mbathy(ji,jj+1) + 1 1534 bathy (ji,jj+1) = gdepw_1d(mbathy (ji,jj+1) ) + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat ) 1535 ELSE 1536 misfdep(ji,jj) = misfdep(ji,jj) - 1 1537 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj )+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj ) )*e3zps_rat ) 1538 END IF 1539 ELSE 1540 misfdep(ji,jj) = misfdep(ji,jj) - 1 1541 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj )+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj ) )*e3zps_rat ) 1542 END IF 1543 ENDIF 1544 END DO 1545 END DO 1546 1547 1548 IF( lk_mpp ) THEN 1549 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1550 CALL lbc_lnk( zbathy, 'T', 1. ) 1551 misfdep(:,:) = INT( zbathy(:,:) ) 1552 1553 CALL lbc_lnk( risfdep,'T', 1. ) 1554 CALL lbc_lnk( bathy, 'T', 1. ) 1555 1556 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1557 CALL lbc_lnk( zbathy, 'T', 1. ) 1558 mbathy(:,:) = INT( zbathy(:,:) ) 1559 ENDIF 1560 1561 ! point U mbathy(ji,jj) == misfdep(ji,jj+1) 1562 DO jj = 1, jpjm1 1563 DO ji = 1, jpim1 1564 IF( misfdep(ji+1,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) > 1) THEN 1565 IF ( .NOT. ln_iscpl ) THEN 1566 zbathydiff =ABS( bathy(ji ,jj) - ( gdepw_1d(mbathy (ji,jj)+1) & 1567 & + MIN( e3zps_min, e3t_1d(mbathy (ji ,jj)+1)*e3zps_rat ))) 1568 zrisfdepdiff=ABS(risfdep(ji+1,jj) - ( gdepw_1d(misfdep(ji+1,jj)) & 1569 & - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj)-1)*e3zps_rat ))) 1570 IF (zbathydiff <= zrisfdepdiff) THEN 1571 mbathy(ji,jj) = mbathy(ji,jj) + 1 1572 bathy(ji,jj) = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat ) 1573 ELSE 1574 misfdep(ji+1,jj)= misfdep(ji+1,jj) - 1 1575 risfdep(ji+1,jj) = gdepw_1d(misfdep(ji+1,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj))*e3zps_rat ) 1576 END IF 1577 ELSE 1578 misfdep(ji+1,jj)= misfdep(ji+1,jj) - 1 1579 risfdep(ji+1,jj) = gdepw_1d(misfdep(ji+1,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj))*e3zps_rat ) 1580 ENDIF 1581 ENDIF 1582 ENDDO 1583 ENDDO 1584 1585 IF( lk_mpp ) THEN 1586 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1587 CALL lbc_lnk( zbathy, 'T', 1. ) 1588 misfdep(:,:) = INT( zbathy(:,:) ) 1589 1590 CALL lbc_lnk( risfdep,'T', 1. ) 1591 CALL lbc_lnk( bathy, 'T', 1. ) 1592 1593 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1594 CALL lbc_lnk( zbathy, 'T', 1. ) 1595 mbathy(:,:) = INT( zbathy(:,:) ) 1596 ENDIF 1597 1598 ! point U misfdep(ji,jj) == bathy(ji,jj+1) 1599 DO jj = 1, jpjm1 1600 DO ji = 1, jpim1 1601 IF( misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) > 1) THEN 1602 IF ( .NOT. ln_iscpl ) THEN 1603 zbathydiff =ABS( bathy(ji+1,jj) - ( gdepw_1d(mbathy (ji+1,jj)+1) & 1604 & + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj)+1)*e3zps_rat ))) 1605 zrisfdepdiff=ABS(risfdep(ji ,jj) - ( gdepw_1d(misfdep(ji ,jj) ) & 1606 & - MIN( e3zps_min, e3t_1d(misfdep(ji ,jj)-1)*e3zps_rat ))) 1607 IF (zbathydiff <= zrisfdepdiff) THEN 1608 mbathy(ji+1,jj) = mbathy (ji+1,jj) + 1 1609 bathy (ji+1,jj) = gdepw_1d(mbathy (ji+1,jj) ) + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj) +1)*e3zps_rat ) 1610 ELSE 1611 misfdep(ji,jj) = misfdep(ji ,jj) - 1 1612 risfdep(ji,jj) = gdepw_1d(misfdep(ji ,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji ,jj) )*e3zps_rat ) 1613 END IF 1614 ELSE 1615 misfdep(ji,jj) = misfdep(ji ,jj) - 1 1616 risfdep(ji,jj) = gdepw_1d(misfdep(ji ,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji ,jj) )*e3zps_rat ) 1617 ENDIF 1618 ENDIF 1619 ENDDO 1620 ENDDO 1621 1622 IF( lk_mpp ) THEN 1623 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1624 CALL lbc_lnk( zbathy, 'T', 1. ) 1625 misfdep(:,:) = INT( zbathy(:,:) ) 1626 1627 CALL lbc_lnk( risfdep,'T', 1. ) 1628 CALL lbc_lnk( bathy, 'T', 1. ) 1629 1630 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1631 CALL lbc_lnk( zbathy, 'T', 1. ) 1632 mbathy(:,:) = INT( zbathy(:,:) ) 1633 ENDIF 1634 END DO 1635 ! end dig bathy/ice shelf to be compatible 1636 ! now fill single point in "coastline" of ice shelf, bathy, hole, and test again one cell tickness 1637 DO jl = 1,20 1638 1639 ! remove single point "bay" on isf coast line in the ice shelf draft' 1640 DO jk = 2, jpk 1641 WHERE (misfdep==0) misfdep=jpk 1642 zmask=0._wp 1643 WHERE (misfdep <= jk) zmask=1 1644 DO jj = 2, jpjm1 1645 DO ji = 2, jpim1 1646 IF (misfdep(ji,jj) == jk) THEN 1647 ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 1648 IF (ibtest <= 1) THEN 1649 risfdep(ji,jj)=gdepw_1d(jk+1) ; misfdep(ji,jj)=jk+1 1650 IF (misfdep(ji,jj) > mbathy(ji,jj)) misfdep(ji,jj) = jpk 1651 END IF 1652 END IF 1653 END DO 1654 END DO 1655 END DO 1656 WHERE (misfdep==jpk) 1657 misfdep=0 ; risfdep=0._wp ; mbathy=0 ; bathy=0._wp 1658 END WHERE 1659 IF( lk_mpp ) THEN 1660 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1661 CALL lbc_lnk( zbathy, 'T', 1. ) 1662 misfdep(:,:) = INT( zbathy(:,:) ) 1663 1664 CALL lbc_lnk( risfdep,'T', 1. ) 1665 CALL lbc_lnk( bathy, 'T', 1. ) 1666 1667 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1668 CALL lbc_lnk( zbathy, 'T', 1. ) 1669 mbathy(:,:) = INT( zbathy(:,:) ) 1670 ENDIF 1671 1672 ! remove single point "bay" on bathy coast line beneath an ice shelf' 1673 DO jk = jpk,1,-1 1674 zmask=0._wp 1675 WHERE (mbathy >= jk ) zmask=1 1676 DO jj = 2, jpjm1 1677 DO ji = 2, jpim1 1678 IF (mbathy(ji,jj) == jk .AND. misfdep(ji,jj) >= 2) THEN 1679 ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 1680 IF (ibtest <= 1) THEN 1681 bathy(ji,jj)=gdepw_1d(jk) ; mbathy(ji,jj)=jk-1 1682 IF (misfdep(ji,jj) > mbathy(ji,jj)) mbathy(ji,jj) = 0 1683 END IF 1684 END IF 1685 END DO 1686 END DO 1687 END DO 1688 WHERE (mbathy==0) 1689 misfdep=0 ; risfdep=0._wp ; mbathy=0 ; bathy=0._wp 1690 END WHERE 1691 IF( lk_mpp ) THEN 1692 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1693 CALL lbc_lnk( zbathy, 'T', 1. ) 1694 misfdep(:,:) = INT( zbathy(:,:) ) 1695 1696 CALL lbc_lnk( risfdep,'T', 1. ) 1697 CALL lbc_lnk( bathy, 'T', 1. ) 1698 1699 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1700 CALL lbc_lnk( zbathy, 'T', 1. ) 1701 mbathy(:,:) = INT( zbathy(:,:) ) 1702 ENDIF 1703 1704 ! fill hole in ice shelf 1705 zmisfdep = misfdep 1706 zrisfdep = risfdep 1707 WHERE (zmisfdep <= 1._wp) zmisfdep=jpk 1708 DO jj = 2, jpjm1 1709 DO ji = 2, jpim1 1710 ibtestim1 = zmisfdep(ji-1,jj ) ; ibtestip1 = zmisfdep(ji+1,jj ) 1711 ibtestjm1 = zmisfdep(ji ,jj-1) ; ibtestjp1 = zmisfdep(ji ,jj+1) 1712 IF( zmisfdep(ji,jj) >= mbathy(ji-1,jj ) ) ibtestim1 = jpk 1713 IF( zmisfdep(ji,jj) >= mbathy(ji+1,jj ) ) ibtestip1 = jpk 1714 IF( zmisfdep(ji,jj) >= mbathy(ji ,jj-1) ) ibtestjm1 = jpk 1715 IF( zmisfdep(ji,jj) >= mbathy(ji ,jj+1) ) ibtestjp1 = jpk 1716 ibtest=MIN(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1) 1717 IF( ibtest == jpk .AND. misfdep(ji,jj) >= 2) THEN 1718 mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp 1719 END IF 1720 IF( zmisfdep(ji,jj) < ibtest .AND. misfdep(ji,jj) >= 2) THEN 1721 misfdep(ji,jj) = ibtest 1722 risfdep(ji,jj) = gdepw_1d(ibtest) 1723 ENDIF 1724 ENDDO 1725 ENDDO 1726 1727 IF( lk_mpp ) THEN 1728 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1729 CALL lbc_lnk( zbathy, 'T', 1. ) 1730 misfdep(:,:) = INT( zbathy(:,:) ) 1731 1732 CALL lbc_lnk( risfdep, 'T', 1. ) 1733 CALL lbc_lnk( bathy, 'T', 1. ) 1734 1735 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1736 CALL lbc_lnk( zbathy, 'T', 1. ) 1737 mbathy(:,:) = INT( zbathy(:,:) ) 1738 ENDIF 1739 ! 1740 !! fill hole in bathymetry 1741 zmbathy (:,:)=mbathy (:,:) 1742 DO jj = 2, jpjm1 1743 DO ji = 2, jpim1 1744 ibtestim1 = zmbathy(ji-1,jj ) ; ibtestip1 = zmbathy(ji+1,jj ) 1745 ibtestjm1 = zmbathy(ji ,jj-1) ; ibtestjp1 = zmbathy(ji ,jj+1) 1746 IF( zmbathy(ji,jj) < misfdep(ji-1,jj ) ) ibtestim1 = 0 1747 IF( zmbathy(ji,jj) < misfdep(ji+1,jj ) ) ibtestip1 = 0 1748 IF( zmbathy(ji,jj) < misfdep(ji ,jj-1) ) ibtestjm1 = 0 1749 IF( zmbathy(ji,jj) < misfdep(ji ,jj+1) ) ibtestjp1 = 0 1750 ibtest=MAX(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1) 1751 IF( ibtest == 0 .AND. misfdep(ji,jj) >= 2) THEN 1752 mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp ; 1753 END IF 1754 IF( ibtest < zmbathy(ji,jj) .AND. misfdep(ji,jj) >= 2) THEN 1755 mbathy(ji,jj) = ibtest 1756 bathy(ji,jj) = gdepw_1d(ibtest+1) 1757 ENDIF 1758 END DO 1759 END DO 1760 IF( lk_mpp ) THEN 1761 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1762 CALL lbc_lnk( zbathy, 'T', 1. ) 1763 misfdep(:,:) = INT( zbathy(:,:) ) 1764 1765 CALL lbc_lnk( risfdep, 'T', 1. ) 1766 CALL lbc_lnk( bathy, 'T', 1. ) 1767 1768 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1769 CALL lbc_lnk( zbathy, 'T', 1. ) 1770 mbathy(:,:) = INT( zbathy(:,:) ) 1771 ENDIF 1772 ! if not compatible after all check (ie U point water column less than 2 cells), mask U 1773 DO jj = 1, jpjm1 1774 DO ji = 1, jpim1 1775 IF (mbathy(ji,jj) == misfdep(ji+1,jj) .AND. mbathy(ji,jj) >= 1 .AND. mbathy(ji+1,jj) >= 1) THEN 1776 mbathy(ji,jj) = mbathy(ji,jj) - 1 ; bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)+1) ; 1777 END IF 1778 END DO 1779 END DO 1780 IF( lk_mpp ) THEN 1781 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1782 CALL lbc_lnk( zbathy, 'T', 1. ) 1783 misfdep(:,:) = INT( zbathy(:,:) ) 1784 1785 CALL lbc_lnk( risfdep, 'T', 1. ) 1786 CALL lbc_lnk( bathy, 'T', 1. ) 1787 1788 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1789 CALL lbc_lnk( zbathy, 'T', 1. ) 1790 mbathy(:,:) = INT( zbathy(:,:) ) 1791 ENDIF 1792 ! if not compatible after all check (ie U point water column less than 2 cells), mask U 1793 DO jj = 1, jpjm1 1794 DO ji = 1, jpim1 1795 IF (misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) >= 1 .AND. mbathy(ji+1,jj) >= 1) THEN 1796 mbathy(ji+1,jj) = mbathy(ji+1,jj) - 1; bathy(ji+1,jj) = gdepw_1d(mbathy(ji+1,jj)+1) ; 1797 END IF 1798 END DO 1799 END DO 1800 IF( lk_mpp ) THEN 1801 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1802 CALL lbc_lnk( zbathy, 'T', 1. ) 1803 misfdep(:,:) = INT( zbathy(:,:) ) 1804 1805 CALL lbc_lnk( risfdep,'T', 1. ) 1806 CALL lbc_lnk( bathy, 'T', 1. ) 1807 1808 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1809 CALL lbc_lnk( zbathy, 'T', 1. ) 1810 mbathy(:,:) = INT( zbathy(:,:) ) 1811 ENDIF 1812 ! if not compatible after all check (ie V point water column less than 2 cells), mask V 1813 DO jj = 1, jpjm1 1814 DO ji = 1, jpi 1815 IF (mbathy(ji,jj) == misfdep(ji,jj+1) .AND. mbathy(ji,jj) >= 1 .AND. mbathy(ji,jj+1) >= 1) THEN 1816 mbathy(ji,jj) = mbathy(ji,jj) - 1 ; bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)+1) ; 1817 END IF 1818 END DO 1819 END DO 1820 IF( lk_mpp ) THEN 1821 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1822 CALL lbc_lnk( zbathy, 'T', 1. ) 1823 misfdep(:,:) = INT( zbathy(:,:) ) 1824 1825 CALL lbc_lnk( risfdep,'T', 1. ) 1826 CALL lbc_lnk( bathy, 'T', 1. ) 1827 1828 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1829 CALL lbc_lnk( zbathy, 'T', 1. ) 1830 mbathy(:,:) = INT( zbathy(:,:) ) 1831 ENDIF 1832 ! if not compatible after all check (ie V point water column less than 2 cells), mask V 1833 DO jj = 1, jpjm1 1834 DO ji = 1, jpi 1835 IF (misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) >= 1 .AND. mbathy(ji,jj+1) >= 1) THEN 1836 mbathy(ji,jj+1) = mbathy(ji,jj+1) - 1 ; bathy(ji,jj+1) = gdepw_1d(mbathy(ji,jj+1)+1) ; 1837 END IF 1838 END DO 1839 END DO 1840 IF( lk_mpp ) THEN 1841 zbathy(:,:) = FLOAT( misfdep(:,:) ) 1842 CALL lbc_lnk( zbathy, 'T', 1. ) 1843 misfdep(:,:) = INT( zbathy(:,:) ) 1844 1845 CALL lbc_lnk( risfdep,'T', 1. ) 1846 CALL lbc_lnk( bathy, 'T', 1. ) 1847 1848 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1849 CALL lbc_lnk( zbathy, 'T', 1. ) 1850 mbathy(:,:) = INT( zbathy(:,:) ) 1851 ENDIF 1852 ! if not compatible after all check, mask T 1853 DO jj = 1, jpj 1854 DO ji = 1, jpi 1855 IF (mbathy(ji,jj) <= misfdep(ji,jj)) THEN 1856 misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0._wp ; mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0._wp ; 1857 END IF 1858 END DO 1859 END DO 1860 1861 WHERE (mbathy(:,:) == 1) 1862 mbathy = 0; bathy = 0.0_wp ; misfdep = 0 ; risfdep = 0.0_wp 1863 END WHERE 1864 END DO 1865 ! end check compatibility ice shelf/bathy 1866 ! remove very shallow ice shelf (less than ~ 10m if 75L) 1867 WHERE (risfdep(:,:) <= 10._wp) 1868 misfdep = 1; risfdep = 0.0_wp; 1869 END WHERE 1870 1871 IF( icompt == 0 ) THEN 1872 IF(lwp) WRITE(numout,*)' no points with ice shelf too close to bathymetry' 1873 ELSE 1874 IF(lwp) WRITE(numout,*)' ',icompt,' ocean grid points with ice shelf thickness reduced to avoid bathymetry' 1875 ENDIF 1876 1877 ! compute scale factor and depth at T- and W- points 1878 DO jj = 1, jpj 1879 DO ji = 1, jpi 1880 ik = mbathy(ji,jj) 1881 IF( ik > 0 ) THEN ! ocean point only 1882 ! max ocean level case 1883 IF( ik == jpkm1 ) THEN 1884 zdepwp = bathy(ji,jj) 1885 ze3tp = bathy(ji,jj) - gdepw_1d(ik) 1886 ze3wp = 0.5_wp * e3w_1d(ik) * ( 1._wp + ( ze3tp/e3t_1d(ik) ) ) 1887 e3t_0(ji,jj,ik ) = ze3tp 1888 e3t_0(ji,jj,ik+1) = ze3tp 1889 e3w_0(ji,jj,ik ) = ze3wp 1890 e3w_0(ji,jj,ik+1) = ze3tp 1891 gdepw_0(ji,jj,ik+1) = zdepwp 1892 gdept_0(ji,jj,ik ) = gdept_1d(ik-1) + ze3wp 1893 gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + ze3tp 1894 ! 1895 ELSE ! standard case 1896 IF( bathy(ji,jj) <= gdepw_1d(ik+1) ) THEN ; gdepw_0(ji,jj,ik+1) = bathy(ji,jj) 1897 ELSE ; gdepw_0(ji,jj,ik+1) = gdepw_1d(ik+1) 1898 ENDIF 1899 ! gdepw_0(ji,jj,ik+1) = gdepw_1d(ik+1) 1900 !gm Bug? check the gdepw_1d 1901 ! ... on ik 1902 gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0(ji,jj,ik+1) - gdepw_1d(ik) ) & 1903 & * ((gdept_1d( ik ) - gdepw_1d(ik) ) & 1904 & / ( gdepw_1d( ik+1) - gdepw_1d(ik) )) 1905 e3t_0 (ji,jj,ik ) = gdepw_0(ji,jj,ik+1) - gdepw_1d(ik ) 1906 e3w_0 (ji,jj,ik ) = gdept_0(ji,jj,ik ) - gdept_1d(ik-1) 1907 ! ... on ik+1 1908 e3w_0 (ji,jj,ik+1) = e3t_0 (ji,jj,ik) 1909 e3t_0 (ji,jj,ik+1) = e3t_0 (ji,jj,ik) 1910 ENDIF 1911 ENDIF 1912 END DO 1913 END DO 1914 ! 1915 it = 0 1916 DO jj = 1, jpj 1917 DO ji = 1, jpi 1918 ik = mbathy(ji,jj) 1919 IF( ik > 0 ) THEN ! ocean point only 1920 e3tp (ji,jj) = e3t_0(ji,jj,ik) 1921 e3wp (ji,jj) = e3w_0(ji,jj,ik) 1922 ! test 1923 zdiff= gdepw_0(ji,jj,ik+1) - gdept_0(ji,jj,ik ) 1924 IF( zdiff <= 0._wp .AND. lwp ) THEN 1925 it = it + 1 1926 WRITE(numout,*) ' it = ', it, ' ik = ', ik, ' (i,j) = ', ji, jj 1927 WRITE(numout,*) ' bathy = ', bathy(ji,jj) 1928 WRITE(numout,*) ' gdept_0 = ', gdept_0(ji,jj,ik), ' gdepw_0 = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff 1929 WRITE(numout,*) ' e3tp = ', e3t_0 (ji,jj,ik), ' e3wp = ', e3w_0 (ji,jj,ik ) 1930 ENDIF 1931 ENDIF 1932 END DO 1933 END DO 1934 ! 1935 ! (ISF) Definition of e3t, u, v, w for ISF case 1936 DO jj = 1, jpj 1937 DO ji = 1, jpi 1938 ik = misfdep(ji,jj) 1939 IF( ik > 1 ) THEN ! ice shelf point only 1940 IF( risfdep(ji,jj) < gdepw_1d(ik) ) risfdep(ji,jj)= gdepw_1d(ik) 1941 gdepw_0(ji,jj,ik) = risfdep(ji,jj) 1942 !gm Bug? check the gdepw_0 1943 ! ... on ik 1944 gdept_0(ji,jj,ik) = gdepw_1d(ik+1) - ( gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) ) & 1945 & * ( gdepw_1d(ik+1) - gdept_1d(ik) ) & 1946 & / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) 1947 e3t_0 (ji,jj,ik ) = gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) 1948 e3w_0 (ji,jj,ik+1) = gdept_1d(ik+1) - gdept_0(ji,jj,ik) 1949 1950 IF( ik + 1 == mbathy(ji,jj) ) THEN ! ice shelf point only (2 cell water column) 1951 e3w_0 (ji,jj,ik+1) = gdept_0(ji,jj,ik+1) - gdept_0(ji,jj,ik) 1952 ENDIF 1953 ! ... on ik / ik-1 1954 e3w_0 (ji,jj,ik ) = e3t_0 (ji,jj,ik) !2._wp * (gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik)) 1955 e3t_0 (ji,jj,ik-1) = gdepw_0(ji,jj,ik) - gdepw_1d(ik-1) 1956 ! The next line isn't required and doesn't affect results - included for consistency with bathymetry code 1957 gdept_0(ji,jj,ik-1) = gdept_1d(ik-1) 1958 ENDIF 1959 END DO 1960 END DO 1961 1962 it = 0 1963 DO jj = 1, jpj 1964 DO ji = 1, jpi 1965 ik = misfdep(ji,jj) 1966 IF( ik > 1 ) THEN ! ice shelf point only 1967 e3tp (ji,jj) = e3t_0(ji,jj,ik ) 1968 e3wp (ji,jj) = e3w_0(ji,jj,ik+1 ) 1969 ! test 1970 zdiff= gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik ) 1971 IF( zdiff <= 0. .AND. lwp ) THEN 1972 it = it + 1 1973 WRITE(numout,*) ' it = ', it, ' ik = ', ik, ' (i,j) = ', ji, jj 1974 WRITE(numout,*) ' risfdep = ', risfdep(ji,jj) 1975 WRITE(numout,*) ' gdept = ', gdept_0(ji,jj,ik), ' gdepw = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff 1976 WRITE(numout,*) ' e3tp = ', e3tp(ji,jj), ' e3wp = ', e3wp(ji,jj) 1977 ENDIF 1978 ENDIF 1979 END DO 1980 END DO 1981 1982 CALL wrk_dealloc( jpi, jpj, zmask, zbathy, zrisfdep ) 1983 CALL wrk_dealloc( jpi, jpj, zmisfdep, zmbathy ) 1984 ! 1985 IF( nn_timing == 1 ) CALL timing_stop('zgr_isf') 1986 ! 1987 END SUBROUTINE zgr_isf 1988 1989 1990 SUBROUTINE zgr_sco 1991 !!---------------------------------------------------------------------- 1992 !! *** ROUTINE zgr_sco *** 1993 !! 1994 !! ** Purpose : define the s-coordinate system 1995 !! 1996 !! ** Method : s-coordinate 1997 !! The depth of model levels is defined as the product of an 1998 !! analytical function by the local bathymetry, while the vertical 1999 !! scale factors are defined as the product of the first derivative 2000 !! of the analytical function by the bathymetry. 2001 !! (this solution save memory as depth and scale factors are not 2002 !! 3d fields) 2003 !! - Read bathymetry (in meters) at t-point and compute the 2004 !! bathymetry at u-, v-, and f-points. 2005 !! hbatu = mi( hbatt ) 2006 !! hbatv = mj( hbatt ) 2007 !! hbatf = mi( mj( hbatt ) ) 2008 !! - Compute z_gsigt, z_gsigw, z_esigt, z_esigw from an analytical 2009 !! function and its derivative given as function. 2010 !! z_gsigt(k) = fssig (k ) 2011 !! z_gsigw(k) = fssig (k-0.5) 2012 !! z_esigt(k) = fsdsig(k ) 2013 !! z_esigw(k) = fsdsig(k-0.5) 2014 !! Three options for stretching are give, and they can be modified 2015 !! following the users requirements. Nevertheless, the output as 2016 !! well as the way to compute the model levels and scale factors 2017 !! must be respected in order to insure second order accuracy 2018 !! schemes. 2019 !! 2020 !! The three methods for stretching available are: 2021 !! 2022 !! s_sh94 (Song and Haidvogel 1994) 2023 !! a sinh/tanh function that allows sigma and stretched sigma 2024 !! 2025 !! s_sf12 (Siddorn and Furner 2012?) 2026 !! allows the maintenance of fixed surface and or 2027 !! bottom cell resolutions (cf. geopotential coordinates) 2028 !! within an analytically derived stretched S-coordinate framework. 2029 !! 2030 !! s_tanh (Madec et al 1996) 2031 !! a cosh/tanh function that gives stretched coordinates 2032 !! 2033 !!---------------------------------------------------------------------- 2034 INTEGER :: ji, jj, jk, jl ! dummy loop argument 2035 INTEGER :: iip1, ijp1, iim1, ijm1 ! temporary integers 2036 INTEGER :: ios ! Local integer output status for namelist read 2037 REAL(wp) :: zrmax, ztaper ! temporary scalars 2038 REAL(wp) :: zrfact 2039 ! 2040 REAL(wp), POINTER, DIMENSION(:,: ) :: ztmpi1, ztmpi2, ztmpj1, ztmpj2 2041 REAL(wp), POINTER, DIMENSION(:,: ) :: zenv, ztmp, zmsk, zri, zrj, zhbat 2042 !! 2043 NAMELIST/namzgr_sco/ln_s_sh94, ln_s_sf12, ln_sigcrit, rn_sbot_min, rn_sbot_max, rn_hc, rn_rmax,rn_theta, & 2044 & rn_thetb, rn_bb, rn_alpha, rn_efold, rn_zs, rn_zb_a, rn_zb_b 2045 !!---------------------------------------------------------------------- 2046 ! 2047 IF( nn_timing == 1 ) CALL timing_start('zgr_sco') 2048 ! 2049 CALL wrk_alloc( jpi,jpj, zenv, ztmp, zmsk, zri, zrj, zhbat , ztmpi1, ztmpi2, ztmpj1, ztmpj2 ) 2050 ! 2051 REWIND( numnam_ref ) ! Namelist namzgr_sco in reference namelist : Sigma-stretching parameters 2052 READ ( numnam_ref, namzgr_sco, IOSTAT = ios, ERR = 901) 2053 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzgr_sco in reference namelist', lwp ) 2054 2055 REWIND( numnam_cfg ) ! Namelist namzgr_sco in configuration namelist : Sigma-stretching parameters 2056 READ ( numnam_cfg, namzgr_sco, IOSTAT = ios, ERR = 902 ) 2057 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzgr_sco in configuration namelist', lwp ) 2058 IF(lwm) WRITE ( numond, namzgr_sco ) 2059 2060 IF(lwp) THEN ! control print 2061 WRITE(numout,*) 2062 WRITE(numout,*) 'domzgr_sco : s-coordinate or hybrid z-s-coordinate' 2063 WRITE(numout,*) '~~~~~~~~~~~' 2064 WRITE(numout,*) ' Namelist namzgr_sco' 2065 WRITE(numout,*) ' stretching coeffs ' 2066 WRITE(numout,*) ' maximum depth of s-bottom surface (>0) rn_sbot_max = ',rn_sbot_max 2067 WRITE(numout,*) ' minimum depth of s-bottom surface (>0) rn_sbot_min = ',rn_sbot_min 2068 WRITE(numout,*) ' Critical depth rn_hc = ',rn_hc 2069 WRITE(numout,*) ' maximum cut-off r-value allowed rn_rmax = ',rn_rmax 2070 WRITE(numout,*) ' Song and Haidvogel 1994 stretching ln_s_sh94 = ',ln_s_sh94 2071 WRITE(numout,*) ' Song and Haidvogel 1994 stretching coefficients' 2072 WRITE(numout,*) ' surface control parameter (0<=rn_theta<=20) rn_theta = ',rn_theta 2073 WRITE(numout,*) ' bottom control parameter (0<=rn_thetb<= 1) rn_thetb = ',rn_thetb 2074 WRITE(numout,*) ' stretching parameter (song and haidvogel) rn_bb = ',rn_bb 2075 WRITE(numout,*) ' Siddorn and Furner 2012 stretching ln_s_sf12 = ',ln_s_sf12 2076 WRITE(numout,*) ' switching to sigma (T) or Z (F) at H<Hc ln_sigcrit = ',ln_sigcrit 2077 WRITE(numout,*) ' Siddorn and Furner 2012 stretching coefficients' 2078 WRITE(numout,*) ' stretchin parameter ( >1 surface; <1 bottom) rn_alpha = ',rn_alpha 2079 WRITE(numout,*) ' e-fold length scale for transition region rn_efold = ',rn_efold 2080 WRITE(numout,*) ' Surface cell depth (Zs) (m) rn_zs = ',rn_zs 2081 WRITE(numout,*) ' Bathymetry multiplier for Zb rn_zb_a = ',rn_zb_a 2082 WRITE(numout,*) ' Offset for Zb rn_zb_b = ',rn_zb_b 2083 WRITE(numout,*) ' Bottom cell (Zb) (m) = H*rn_zb_a + rn_zb_b' 2084 ENDIF 2085 2086 hift(:,:) = rn_sbot_min ! set the minimum depth for the s-coordinate 2087 hifu(:,:) = rn_sbot_min 2088 hifv(:,:) = rn_sbot_min 2089 hiff(:,:) = rn_sbot_min 2090 2091 ! ! set maximum ocean depth 2092 bathy(:,:) = MIN( rn_sbot_max, bathy(:,:) ) 2093 2094 IF( .NOT.ln_wd ) THEN 2095 DO jj = 1, jpj 2096 DO ji = 1, jpi 2097 IF( bathy(ji,jj) > 0._wp ) bathy(ji,jj) = MAX( rn_sbot_min, bathy(ji,jj) ) 2098 END DO 2099 END DO 2100 END IF 2101 ! ! ============================= 2102 ! ! Define the envelop bathymetry (hbatt) 2103 ! ! ============================= 2104 ! use r-value to create hybrid coordinates 2105 zenv(:,:) = bathy(:,:) 2106 ! 2107 IF( .NOT.ln_wd ) THEN 2108 ! set first land point adjacent to a wet cell to sbot_min as this needs to be included in smoothing 2109 DO jj = 1, jpj 2110 DO ji = 1, jpi 2111 IF( bathy(ji,jj) == 0._wp ) THEN 2112 iip1 = MIN( ji+1, jpi ) 2113 ijp1 = MIN( jj+1, jpj ) 2114 iim1 = MAX( ji-1, 1 ) 2115 ijm1 = MAX( jj-1, 1 ) 2116 !!gm BUG fix see ticket #1617 2117 IF( ( + bathy(iim1,ijm1) + bathy(ji,ijp1) + bathy(iip1,ijp1) & 2118 & + bathy(iim1,jj ) + bathy(iip1,jj ) & 2119 & + bathy(iim1,ijm1) + bathy(ji,ijm1) + bathy(iip1,ijp1) ) > 0._wp ) & 2120 & zenv(ji,jj) = rn_sbot_min 2121 !!gm 2122 !!gm IF( ( bathy(iip1,jj ) + bathy(iim1,jj ) + bathy(ji,ijp1 ) + bathy(ji,ijm1) + & 2123 !!gm & bathy(iip1,ijp1) + bathy(iim1,ijm1) + bathy(iip1,ijp1) + bathy(iim1,ijm1)) > 0._wp ) THEN 2124 !!gm zenv(ji,jj) = rn_sbot_min 2125 !!gm ENDIF 2126 !!gm end 2127 ENDIF 2128 END DO 2129 END DO 2130 END IF 2131 2132 ! apply lateral boundary condition CAUTION: keep the value when the lbc field is zero 2133 CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 2134 ! 2135 ! smooth the bathymetry (if required) 2136 scosrf(:,:) = 0._wp ! ocean surface depth (here zero: no under ice-shelf sea) 2137 scobot(:,:) = bathy(:,:) ! ocean bottom depth 2138 ! 2139 jl = 0 2140 zrmax = 1._wp 2141 ! 2142 ! 2143 ! set scaling factor used in reducing vertical gradients 2144 zrfact = ( 1._wp - rn_rmax ) / ( 1._wp + rn_rmax ) 2145 ! 2146 ! initialise temporary evelope depth arrays 2147 ztmpi1(:,:) = zenv(:,:) 2148 ztmpi2(:,:) = zenv(:,:) 2149 ztmpj1(:,:) = zenv(:,:) 2150 ztmpj2(:,:) = zenv(:,:) 2151 ! 2152 ! initialise temporary r-value arrays 2153 zri(:,:) = 1._wp 2154 zrj(:,:) = 1._wp 2155 ! ! ================ ! 2156 DO WHILE( jl <= 10000 .AND. ( zrmax - rn_rmax ) > 1.e-8_wp ) ! Iterative loop ! 2157 ! ! ================ ! 2158 jl = jl + 1 2159 zrmax = 0._wp 2160 ! we set zrmax from previous r-values (zri and zrj) first 2161 ! if set after current r-value calculation (as previously) 2162 ! we could exit DO WHILE prematurely before checking r-value 2163 ! of current zenv 2164 DO jj = 1, nlcj 2165 DO ji = 1, nlci 2166 zrmax = MAX( zrmax, ABS(zri(ji,jj)), ABS(zrj(ji,jj)) ) 2167 END DO 2168 END DO 2169 zri(:,:) = 0._wp 2170 zrj(:,:) = 0._wp 2171 DO jj = 1, nlcj 2172 DO ji = 1, nlci 2173 iip1 = MIN( ji+1, nlci ) ! force zri = 0 on last line (ji=ncli+1 to jpi) 2174 ijp1 = MIN( jj+1, nlcj ) ! force zrj = 0 on last raw (jj=nclj+1 to jpj) 2175 IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(iip1,jj) > 0._wp)) THEN 2176 zri(ji,jj) = ( zenv(iip1,jj ) - zenv(ji,jj) ) / ( zenv(iip1,jj ) + zenv(ji,jj) ) 2177 END IF 2178 IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(ji,ijp1) > 0._wp)) THEN 2179 zrj(ji,jj) = ( zenv(ji ,ijp1) - zenv(ji,jj) ) / ( zenv(ji ,ijp1) + zenv(ji,jj) ) 2180 END IF 2181 IF( zri(ji,jj) > rn_rmax ) ztmpi1(ji ,jj ) = zenv(iip1,jj ) * zrfact 2182 IF( zri(ji,jj) < -rn_rmax ) ztmpi2(iip1,jj ) = zenv(ji ,jj ) * zrfact 2183 IF( zrj(ji,jj) > rn_rmax ) ztmpj1(ji ,jj ) = zenv(ji ,ijp1) * zrfact 2184 IF( zrj(ji,jj) < -rn_rmax ) ztmpj2(ji ,ijp1) = zenv(ji ,jj ) * zrfact 2185 END DO 2186 END DO 2187 IF( lk_mpp ) CALL mpp_max( zrmax ) ! max over the global domain 2188 ! 2189 IF(lwp)WRITE(numout,*) 'zgr_sco : iter= ',jl, ' rmax= ', zrmax 2190 ! 2191 DO jj = 1, nlcj 2192 DO ji = 1, nlci 2193 zenv(ji,jj) = MAX(zenv(ji,jj), ztmpi1(ji,jj), ztmpi2(ji,jj), ztmpj1(ji,jj), ztmpj2(ji,jj) ) 2194 END DO 2195 END DO 2196 ! apply lateral boundary condition CAUTION: keep the value when the lbc field is zero 2197 CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 2198 ! ! ================ ! 2199 END DO ! End loop ! 2200 ! ! ================ ! 2201 DO jj = 1, jpj 2202 DO ji = 1, jpi 2203 zenv(ji,jj) = MAX( zenv(ji,jj), rn_sbot_min ) ! set all points to avoid undefined scale value warnings 2204 END DO 2205 END DO 2206 ! 2207 ! Envelope bathymetry saved in hbatt 2208 hbatt(:,:) = zenv(:,:) 2209 IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN 2210 CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' ) 2211 DO jj = 1, jpj 2212 DO ji = 1, jpi 2213 ztaper = EXP( -(gphit(ji,jj)/8._wp)**2._wp ) 2214 hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper ) 2215 END DO 2216 END DO 2217 ENDIF 2218 ! 2219 ! ! ============================== 2220 ! ! hbatu, hbatv, hbatf fields 2221 ! ! ============================== 2222 IF(lwp) THEN 2223 WRITE(numout,*) 2224 IF( .NOT.ln_wd ) THEN 2225 WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', rn_sbot_min 2226 ELSE 2227 WRITE(numout,*) ' zgr_sco: minimum positive depth of the envelop topography set to : ', rn_sbot_min 2228 WRITE(numout,*) ' zgr_sco: minimum negative depth of the envelop topography set to : ', -rn_wdld 2229 ENDIF 2230 ENDIF 2231 hbatu(:,:) = rn_sbot_min 2232 hbatv(:,:) = rn_sbot_min 2233 hbatf(:,:) = rn_sbot_min 2234 DO jj = 1, jpjm1 2235 DO ji = 1, jpim1 ! NO vector opt. 2236 hbatu(ji,jj) = 0.50_wp * ( hbatt(ji ,jj) + hbatt(ji+1,jj ) ) 2237 hbatv(ji,jj) = 0.50_wp * ( hbatt(ji ,jj) + hbatt(ji ,jj+1) ) 2238 hbatf(ji,jj) = 0.25_wp * ( hbatt(ji ,jj) + hbatt(ji ,jj+1) & 2239 & + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) ) 2240 END DO 2241 END DO 2242 2243 IF( ln_wd ) THEN !avoid the zero depth on T- (U-,V-,F-) points 2244 DO jj = 1, jpj 2245 DO ji = 1, jpi 2246 IF(ABS(hbatt(ji,jj)) < rn_wdmin1) & 2247 & hbatt(ji,jj) = SIGN(1._wp, hbatt(ji,jj)) * rn_wdmin1 2248 IF(ABS(hbatu(ji,jj)) < rn_wdmin1) & 2249 & hbatu(ji,jj) = SIGN(1._wp, hbatu(ji,jj)) * rn_wdmin1 2250 IF(ABS(hbatv(ji,jj)) < rn_wdmin1) & 2251 & hbatv(ji,jj) = SIGN(1._wp, hbatv(ji,jj)) * rn_wdmin1 2252 IF(ABS(hbatf(ji,jj)) < rn_wdmin1) & 2253 & hbatf(ji,jj) = SIGN(1._wp, hbatf(ji,jj)) * rn_wdmin1 2254 END DO 2255 END DO 2256 END IF 2257 ! 2258 ! Apply lateral boundary condition 2259 !!gm ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL 2260 zhbat(:,:) = hbatu(:,:) ; CALL lbc_lnk( hbatu, 'U', 1._wp ) 2261 DO jj = 1, jpj 2262 DO ji = 1, jpi 2263 IF( hbatu(ji,jj) == 0._wp ) THEN 2264 !No worries about the following line when ln_wd == .true. 2265 IF( zhbat(ji,jj) == 0._wp ) hbatu(ji,jj) = rn_sbot_min 2266 IF( zhbat(ji,jj) /= 0._wp ) hbatu(ji,jj) = zhbat(ji,jj) 2267 ENDIF 2268 END DO 2269 END DO 2270 zhbat(:,:) = hbatv(:,:) ; CALL lbc_lnk( hbatv, 'V', 1._wp ) 2271 DO jj = 1, jpj 2272 DO ji = 1, jpi 2273 IF( hbatv(ji,jj) == 0._wp ) THEN 2274 IF( zhbat(ji,jj) == 0._wp ) hbatv(ji,jj) = rn_sbot_min 2275 IF( zhbat(ji,jj) /= 0._wp ) hbatv(ji,jj) = zhbat(ji,jj) 2276 ENDIF 2277 END DO 2278 END DO 2279 zhbat(:,:) = hbatf(:,:) ; CALL lbc_lnk( hbatf, 'F', 1._wp ) 2280 DO jj = 1, jpj 2281 DO ji = 1, jpi 2282 IF( hbatf(ji,jj) == 0._wp ) THEN 2283 IF( zhbat(ji,jj) == 0._wp ) hbatf(ji,jj) = rn_sbot_min 2284 IF( zhbat(ji,jj) /= 0._wp ) hbatf(ji,jj) = zhbat(ji,jj) 2285 ENDIF 2286 END DO 2287 END DO 2288 2289 !!bug: key_helsinki a verifer 2290 IF( .NOT.ln_wd ) THEN 2291 hift(:,:) = MIN( hift(:,:), hbatt(:,:) ) 2292 hifu(:,:) = MIN( hifu(:,:), hbatu(:,:) ) 2293 hifv(:,:) = MIN( hifv(:,:), hbatv(:,:) ) 2294 hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) ) 2295 END IF 2296 2297 IF( nprint == 1 .AND. lwp ) THEN 2298 WRITE(numout,*) ' MAX val hif t ', MAXVAL( hift (:,:) ), ' f ', MAXVAL( hiff (:,:) ), & 2299 & ' u ', MAXVAL( hifu (:,:) ), ' v ', MAXVAL( hifv (:,:) ) 2300 WRITE(numout,*) ' MIN val hif t ', MINVAL( hift (:,:) ), ' f ', MINVAL( hiff (:,:) ), & 2301 & ' u ', MINVAL( hifu (:,:) ), ' v ', MINVAL( hifv (:,:) ) 2302 WRITE(numout,*) ' MAX val hbat t ', MAXVAL( hbatt(:,:) ), ' f ', MAXVAL( hbatf(:,:) ), & 2303 & ' u ', MAXVAL( hbatu(:,:) ), ' v ', MAXVAL( hbatv(:,:) ) 2304 WRITE(numout,*) ' MIN val hbat t ', MINVAL( hbatt(:,:) ), ' f ', MINVAL( hbatf(:,:) ), & 2305 & ' u ', MINVAL( hbatu(:,:) ), ' v ', MINVAL( hbatv(:,:) ) 2306 ENDIF 2307 !! helsinki 2308 2309 ! ! ======================= 2310 ! ! s-ccordinate fields (gdep., e3.) 2311 ! ! ======================= 2312 ! 2313 ! non-dimensional "sigma" for model level depth at w- and t-levels 2314 2315 2316 !======================================================================== 2317 ! Song and Haidvogel 1994 (ln_s_sh94=T) 2318 ! Siddorn and Furner 2012 (ln_sf12=T) 2319 ! or tanh function (both false) 2320 !======================================================================== 2321 IF ( ln_s_sh94 ) THEN 2322 CALL s_sh94() 2323 ELSE IF ( ln_s_sf12 ) THEN 2324 CALL s_sf12() 2325 ELSE 2326 CALL s_tanh() 2327 ENDIF 2328 2329 CALL lbc_lnk( e3t_0 , 'T', 1._wp ) 2330 CALL lbc_lnk( e3u_0 , 'U', 1._wp ) 2331 CALL lbc_lnk( e3v_0 , 'V', 1._wp ) 2332 CALL lbc_lnk( e3f_0 , 'F', 1._wp ) 2333 CALL lbc_lnk( e3w_0 , 'W', 1._wp ) 2334 CALL lbc_lnk( e3uw_0, 'U', 1._wp ) 2335 CALL lbc_lnk( e3vw_0, 'V', 1._wp ) 2336 ! 2337 WHERE( e3t_0 (:,:,:) == 0._wp ) e3t_0 (:,:,:) = 1._wp 2338 WHERE( e3u_0 (:,:,:) == 0._wp ) e3u_0 (:,:,:) = 1._wp 2339 WHERE( e3v_0 (:,:,:) == 0._wp ) e3v_0 (:,:,:) = 1._wp 2340 WHERE( e3f_0 (:,:,:) == 0._wp ) e3f_0 (:,:,:) = 1._wp 2341 WHERE( e3w_0 (:,:,:) == 0._wp ) e3w_0 (:,:,:) = 1._wp 2342 WHERE( e3uw_0(:,:,:) == 0._wp ) e3uw_0(:,:,:) = 1._wp 2343 WHERE( e3vw_0(:,:,:) == 0._wp ) e3vw_0(:,:,:) = 1._wp 2344 2345 #if defined key_agrif 2346 IF( .NOT. Agrif_Root() ) THEN ! Ensure meaningful vertical scale factors in ghost lines/columns 2347 IF( nbondi == -1 .OR. nbondi == 2 ) e3u_0( 1 , : ,:) = e3u_0( 2 , : ,:) 2348 IF( nbondi == 1 .OR. nbondi == 2 ) e3u_0(nlci-1, : ,:) = e3u_0(nlci-2, : ,:) 2349 IF( nbondj == -1 .OR. nbondj == 2 ) e3v_0( : , 1 ,:) = e3v_0( : , 2 ,:) 2350 IF( nbondj == 1 .OR. nbondj == 2 ) e3v_0( : ,nlcj-1,:) = e3v_0( : ,nlcj-2,:) 2351 ENDIF 2352 #endif 2353 2354 !!gm I don't like that HERE we are supposed to set the reference coordinate (i.e. _0 arrays) 2355 !!gm and only that !!!!! 2356 !!gm THIS should be removed from here ! 2357 gdept_n(:,:,:) = gdept_0(:,:,:) 2358 gdepw_n(:,:,:) = gdepw_0(:,:,:) 2359 gde3w_n(:,:,:) = gde3w_0(:,:,:) 2360 e3t_n (:,:,:) = e3t_0 (:,:,:) 2361 e3u_n (:,:,:) = e3u_0 (:,:,:) 2362 e3v_n (:,:,:) = e3v_0 (:,:,:) 2363 e3f_n (:,:,:) = e3f_0 (:,:,:) 2364 e3w_n (:,:,:) = e3w_0 (:,:,:) 2365 e3uw_n (:,:,:) = e3uw_0 (:,:,:) 2366 e3vw_n (:,:,:) = e3vw_0 (:,:,:) 2367 !!gm and obviously in the following, use the _0 arrays until the end of this subroutine 2368 !! gm end 2369 !! 2370 ! HYBRID : 2371 DO jj = 1, jpj 2372 DO ji = 1, jpi 2373 DO jk = 1, jpkm1 2374 IF( scobot(ji,jj) >= gdept_n(ji,jj,jk) ) mbathy(ji,jj) = MAX( 2, jk ) 2375 END DO 2376 IF( ln_wd ) THEN 2377 IF( scobot(ji,jj) <= -(rn_wdld - rn_wdmin2)) THEN 2378 mbathy(ji,jj) = 0 2379 ELSEIF(scobot(ji,jj) <= rn_wdmin1) THEN 2380 mbathy(ji,jj) = 2 2381 ENDIF 2382 ELSE 2383 IF( scobot(ji,jj) == 0._wp ) mbathy(ji,jj) = 0 2384 ENDIF 2385 END DO 2386 END DO 2387 IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ), & 2388 & ' MAX ', MAXVAL( mbathy(:,:) ) 2389 2390 IF( nprint == 1 .AND. lwp ) THEN ! min max values over the local domain 2391 WRITE(numout,*) ' MIN val mbathy ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 2392 WRITE(numout,*) ' MIN val depth t ', MINVAL( gdept_0(:,:,:) ), & 2393 & ' w ', MINVAL( gdepw_0(:,:,:) ), '3w ' , MINVAL( gde3w_0(:,:,:) ) 2394 WRITE(numout,*) ' MIN val e3 t ', MINVAL( e3t_0 (:,:,:) ), ' f ' , MINVAL( e3f_0 (:,:,:) ), & 2395 & ' u ', MINVAL( e3u_0 (:,:,:) ), ' u ' , MINVAL( e3v_0 (:,:,:) ), & 2396 & ' uw', MINVAL( e3uw_0 (:,:,:) ), ' vw' , MINVAL( e3vw_0 (:,:,:) ), & 2397 & ' w ', MINVAL( e3w_0 (:,:,:) ) 2398 2399 WRITE(numout,*) ' MAX val depth t ', MAXVAL( gdept_0(:,:,:) ), & 2400 & ' w ', MAXVAL( gdepw_0(:,:,:) ), '3w ' , MAXVAL( gde3w_0(:,:,:) ) 2401 WRITE(numout,*) ' MAX val e3 t ', MAXVAL( e3t_0 (:,:,:) ), ' f ' , MAXVAL( e3f_0 (:,:,:) ), & 2402 & ' u ', MAXVAL( e3u_0 (:,:,:) ), ' u ' , MAXVAL( e3v_0 (:,:,:) ), & 2403 & ' uw', MAXVAL( e3uw_0 (:,:,:) ), ' vw' , MAXVAL( e3vw_0 (:,:,:) ), & 2404 & ' w ', MAXVAL( e3w_0 (:,:,:) ) 2405 ENDIF 2406 ! END DO 2407 IF(lwp) THEN ! selected vertical profiles 2408 WRITE(numout,*) 2409 WRITE(numout,*) ' domzgr: vertical coordinates : point (1,1,k) bathy = ', bathy(1,1), hbatt(1,1) 2410 WRITE(numout,*) ' ~~~~~~ --------------------' 2411 WRITE(numout,"(9x,' level gdept_0 gdepw_0 e3t_0 e3w_0')") 2412 WRITE(numout,"(10x,i4,4f9.2)") ( jk, gdept_0(1,1,jk), gdepw_0(1,1,jk), & 2413 & e3t_0 (1,1,jk) , e3w_0 (1,1,jk) , jk=1,jpk ) 2414 DO jj = mj0(20), mj1(20) 2415 DO ji = mi0(20), mi1(20) 2416 WRITE(numout,*) 2417 WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k) bathy = ', bathy(ji,jj), hbatt(ji,jj) 2418 WRITE(numout,*) ' ~~~~~~ --------------------' 2419 WRITE(numout,"(9x,' level gdept_0 gdepw_0 e3t_0 e3w_0')") 2420 WRITE(numout,"(10x,i4,4f9.2)") ( jk, gdept_0(ji,jj,jk), gdepw_0(ji,jj,jk), & 2421 & e3t_0 (ji,jj,jk) , e3w_0 (ji,jj,jk) , jk=1,jpk ) 2422 END DO 2423 END DO 2424 DO jj = mj0(74), mj1(74) 2425 DO ji = mi0(100), mi1(100) 2426 WRITE(numout,*) 2427 WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k) bathy = ', bathy(ji,jj), hbatt(ji,jj) 2428 WRITE(numout,*) ' ~~~~~~ --------------------' 2429 WRITE(numout,"(9x,' level gdept_0 gdepw_0 e3t_0 e3w_0')") 2430 WRITE(numout,"(10x,i4,4f9.2)") ( jk, gdept_0(ji,jj,jk), gdepw_0(ji,jj,jk), & 2431 & e3t_0 (ji,jj,jk) , e3w_0 (ji,jj,jk) , jk=1,jpk ) 2432 END DO 2433 END DO 2434 ENDIF 2435 ! 2436 !================================================================================ 2437 ! check the coordinate makes sense 2438 !================================================================================ 2439 DO ji = 1, jpi 2440 DO jj = 1, jpj 2441 ! 2442 IF( hbatt(ji,jj) > 0._wp) THEN 2443 DO jk = 1, mbathy(ji,jj) 2444 ! check coordinate is monotonically increasing 2445 IF (e3w_0(ji,jj,jk) <= 0._wp .OR. e3t_0(ji,jj,jk) <= 0._wp ) THEN 2446 WRITE(ctmp1,*) 'ERROR zgr_sco : e3w or e3t =< 0 at point (i,j,k)= ', ji, jj, jk 2447 WRITE(numout,*) 'ERROR zgr_sco : e3w or e3t =< 0 at point (i,j,k)= ', ji, jj, jk 2448 WRITE(numout,*) 'e3w',e3w_0(ji,jj,:) 2449 WRITE(numout,*) 'e3t',e3t_0(ji,jj,:) 2450 CALL ctl_stop( ctmp1 ) 2451 ENDIF 2452 ! and check it has never gone negative 2453 IF( gdepw_0(ji,jj,jk) < 0._wp .OR. gdept_0(ji,jj,jk) < 0._wp ) THEN 2454 WRITE(ctmp1,*) 'ERROR zgr_sco : gdepw or gdept =< 0 at point (i,j,k)= ', ji, jj, jk 2455 WRITE(numout,*) 'ERROR zgr_sco : gdepw or gdept =< 0 at point (i,j,k)= ', ji, jj, jk 2456 WRITE(numout,*) 'gdepw',gdepw_0(ji,jj,:) 2457 WRITE(numout,*) 'gdept',gdept_0(ji,jj,:) 2458 CALL ctl_stop( ctmp1 ) 2459 ENDIF 2460 ! and check it never exceeds the total depth 2461 IF( gdepw_0(ji,jj,jk) > hbatt(ji,jj) ) THEN 2462 WRITE(ctmp1,*) 'ERROR zgr_sco : gdepw > hbatt at point (i,j,k)= ', ji, jj, jk 2463 WRITE(numout,*) 'ERROR zgr_sco : gdepw > hbatt at point (i,j,k)= ', ji, jj, jk 2464 WRITE(numout,*) 'gdepw',gdepw_0(ji,jj,:) 2465 CALL ctl_stop( ctmp1 ) 2466 ENDIF 2467 END DO 2468 ! 2469 DO jk = 1, mbathy(ji,jj)-1 2470 ! and check it never exceeds the total depth 2471 IF( gdept_0(ji,jj,jk) > hbatt(ji,jj) ) THEN 2472 WRITE(ctmp1,*) 'ERROR zgr_sco : gdept > hbatt at point (i,j,k)= ', ji, jj, jk 2473 WRITE(numout,*) 'ERROR zgr_sco : gdept > hbatt at point (i,j,k)= ', ji, jj, jk 2474 WRITE(numout,*) 'gdept',gdept_0(ji,jj,:) 2475 CALL ctl_stop( ctmp1 ) 2476 ENDIF 2477 END DO 2478 ENDIF 2479 END DO 2480 END DO 2481 ! 2482 CALL wrk_dealloc( jpi, jpj, zenv, ztmp, zmsk, zri, zrj, zhbat , ztmpi1, ztmpi2, ztmpj1, ztmpj2 ) 2483 ! 2484 IF( nn_timing == 1 ) CALL timing_stop('zgr_sco') 2485 ! 2486 END SUBROUTINE zgr_sco 2487 2488 2489 SUBROUTINE s_sh94() 2490 !!---------------------------------------------------------------------- 2491 !! *** ROUTINE s_sh94 *** 2492 !! 2493 !! ** Purpose : stretch the s-coordinate system 2494 !! 2495 !! ** Method : s-coordinate stretch using the Song and Haidvogel 1994 2496 !! mixed S/sigma coordinate 2497 !! 2498 !! Reference : Song and Haidvogel 1994. 2499 !!---------------------------------------------------------------------- 2500 INTEGER :: ji, jj, jk ! dummy loop argument 2501 REAL(wp) :: zcoeft, zcoefw ! temporary scalars 2502 REAL(wp) :: ztmpu, ztmpv, ztmpf 2503 REAL(wp) :: ztmpu1, ztmpv1, ztmpf1 2504 ! 2505 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 2506 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 2507 !!---------------------------------------------------------------------- 2508 2509 CALL wrk_alloc( jpi,jpj,jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 2510 CALL wrk_alloc( jpi,jpj,jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 2511 2512 z_gsigw3 = 0._wp ; z_gsigt3 = 0._wp ; z_gsi3w3 = 0._wp 2513 z_esigt3 = 0._wp ; z_esigw3 = 0._wp 2514 z_esigtu3 = 0._wp ; z_esigtv3 = 0._wp ; z_esigtf3 = 0._wp 2515 z_esigwu3 = 0._wp ; z_esigwv3 = 0._wp 2516 ! 2517 DO ji = 1, jpi 2518 DO jj = 1, jpj 2519 ! 2520 IF( hbatt(ji,jj) > rn_hc ) THEN !deep water, stretched sigma 2521 DO jk = 1, jpk 2522 z_gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 2523 z_gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp) , rn_bb ) 2524 END DO 2525 ELSE ! shallow water, uniform sigma 2526 DO jk = 1, jpk 2527 z_gsigw3(ji,jj,jk) = REAL(jk-1,wp) / REAL(jpk-1,wp) 2528 z_gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(jpk-1,wp) 2529 END DO 2530 ENDIF 2531 ! 2532 DO jk = 1, jpkm1 2533 z_esigt3(ji,jj,jk ) = z_gsigw3(ji,jj,jk+1) - z_gsigw3(ji,jj,jk) 2534 z_esigw3(ji,jj,jk+1) = z_gsigt3(ji,jj,jk+1) - z_gsigt3(ji,jj,jk) 2535 END DO 2536 z_esigw3(ji,jj,1 ) = 2._wp * ( z_gsigt3(ji,jj,1 ) - z_gsigw3(ji,jj,1 ) ) 2537 z_esigt3(ji,jj,jpk) = 2._wp * ( z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk) ) 2538 ! 2539 ! Coefficients for vertical depth as the sum of e3w scale factors 2540 z_gsi3w3(ji,jj,1) = 0.5_wp * z_esigw3(ji,jj,1) 2541 DO jk = 2, jpk 2542 z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk) 2543 END DO 2544 ! 2545 DO jk = 1, jpk 2546 zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 2547 zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 2548 gdept_0(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigt3(ji,jj,jk)+rn_hc*zcoeft ) 2549 gdepw_0(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigw3(ji,jj,jk)+rn_hc*zcoefw ) 2550 gde3w_0(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsi3w3(ji,jj,jk)+rn_hc*zcoeft ) 2551 END DO 2552 ! 2553 END DO ! for all jj's 2554 END DO ! for all ji's 2555 2556 DO ji = 1, jpim1 2557 DO jj = 1, jpjm1 2558 ! extended for Wetting/Drying case 2559 ztmpu = hbatt(ji,jj)+hbatt(ji+1,jj) 2560 ztmpv = hbatt(ji,jj)+hbatt(ji,jj+1) 2561 ztmpf = hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) 2562 ztmpu1 = hbatt(ji,jj)*hbatt(ji+1,jj) 2563 ztmpv1 = hbatt(ji,jj)*hbatt(ji,jj+1) 2564 ztmpf1 = MIN(hbatt(ji,jj), hbatt(ji+1,jj), hbatt(ji,jj+1), hbatt(ji+1,jj+1)) * & 2565 & MAX(hbatt(ji,jj), hbatt(ji+1,jj), hbatt(ji,jj+1), hbatt(ji+1,jj+1)) 2566 DO jk = 1, jpk 2567 IF( ln_wd .AND. (ztmpu1 < 0._wp.OR.ABS(ztmpu) < rn_wdmin1) ) THEN 2568 z_esigtu3(ji,jj,jk) = 0.5_wp * ( z_esigt3(ji,jj,jk) + z_esigt3(ji+1,jj,jk) ) 2569 z_esigwu3(ji,jj,jk) = 0.5_wp * ( z_esigw3(ji,jj,jk) + z_esigw3(ji+1,jj,jk) ) 2570 ELSE 2571 z_esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) ) & 2572 & / ztmpu 2573 z_esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigw3(ji+1,jj,jk) ) & 2574 & / ztmpu 2575 END IF 2576 2577 IF( ln_wd .AND. (ztmpv1 < 0._wp.OR.ABS(ztmpv) < rn_wdmin1) ) THEN 2578 z_esigtv3(ji,jj,jk) = 0.5_wp * ( z_esigt3(ji,jj,jk) + z_esigt3(ji,jj+1,jk) ) 2579 z_esigwv3(ji,jj,jk) = 0.5_wp * ( z_esigw3(ji,jj,jk) + z_esigw3(ji,jj+1,jk) ) 2580 ELSE 2581 z_esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk) ) & 2582 & / ztmpv 2583 z_esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigw3(ji,jj+1,jk) ) & 2584 & / ztmpv 2585 END IF 2586 2587 IF( ln_wd .AND. (ztmpf1 < 0._wp.OR.ABS(ztmpf) < rn_wdmin1) ) THEN 2588 z_esigtf3(ji,jj,jk) = 0.25_wp * ( z_esigt3(ji,jj ,jk) + z_esigt3(ji+1,jj ,jk) & 2589 & + z_esigt3(ji,jj+1,jk) + z_esigt3(ji+1,jj+1,jk) ) 2590 ELSE 2591 z_esigtf3(ji,jj,jk) = ( hbatt(ji ,jj )*z_esigt3(ji ,jj ,jk) & 2592 & + hbatt(ji+1,jj )*z_esigt3(ji+1,jj ,jk) & 2593 & + hbatt(ji ,jj+1)*z_esigt3(ji ,jj+1,jk) & 2594 & + hbatt(ji+1,jj+1)*z_esigt3(ji+1,jj+1,jk) ) / ztmpf 2595 END IF 2596 2597 ! 2598 e3t_0(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*z_esigt3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 2599 e3u_0(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*z_esigtu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 2600 e3v_0(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*z_esigtv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 2601 e3f_0(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*z_esigtf3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 2602 ! 2603 e3w_0 (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*z_esigw3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 2604 e3uw_0(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*z_esigwu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 2605 e3vw_0(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*z_esigwv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 2606 END DO 2607 END DO 2608 END DO 2609 ! 2610 CALL wrk_dealloc( jpi,jpj,jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 2611 CALL wrk_dealloc( jpi,jpj,jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 2612 ! 2613 END SUBROUTINE s_sh94 2614 2615 2616 SUBROUTINE s_sf12 2617 !!---------------------------------------------------------------------- 2618 !! *** ROUTINE s_sf12 *** 2619 !! 2620 !! ** Purpose : stretch the s-coordinate system 2621 !! 2622 !! ** Method : s-coordinate stretch using the Siddorn and Furner 2012? 2623 !! mixed S/sigma/Z coordinate 2624 !! 2625 !! This method allows the maintenance of fixed surface and or 2626 !! bottom cell resolutions (cf. geopotential coordinates) 2627 !! within an analytically derived stretched S-coordinate framework. 2628 !! 2629 !! 2630 !! Reference : Siddorn and Furner 2012 (submitted Ocean modelling). 2631 !!---------------------------------------------------------------------- 2632 INTEGER :: ji, jj, jk ! dummy loop argument 2633 REAL(wp) :: zsmth ! smoothing around critical depth 2634 REAL(wp) :: zzs, zzb ! Surface and bottom cell thickness in sigma space 2635 REAL(wp) :: ztmpu, ztmpv, ztmpf 2636 REAL(wp) :: ztmpu1, ztmpv1, ztmpf1 2637 ! 2638 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 2639 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 2640 !!---------------------------------------------------------------------- 2641 ! 2642 CALL wrk_alloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 2643 CALL wrk_alloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 2644 2645 z_gsigw3 = 0._wp ; z_gsigt3 = 0._wp ; z_gsi3w3 = 0._wp 2646 z_esigt3 = 0._wp ; z_esigw3 = 0._wp 2647 z_esigtu3 = 0._wp ; z_esigtv3 = 0._wp ; z_esigtf3 = 0._wp 2648 z_esigwu3 = 0._wp ; z_esigwv3 = 0._wp 2649 2650 DO ji = 1, jpi 2651 DO jj = 1, jpj 2652 2653 IF (hbatt(ji,jj)>rn_hc) THEN !deep water, stretched sigma 2654 2655 zzb = hbatt(ji,jj)*rn_zb_a + rn_zb_b ! this forces a linear bottom cell depth relationship with H,. 2656 ! could be changed by users but care must be taken to do so carefully 2657 zzb = 1.0_wp-(zzb/hbatt(ji,jj)) 2658 2659 zzs = rn_zs / hbatt(ji,jj) 2660 2661 IF (rn_efold /= 0.0_wp) THEN 2662 zsmth = tanh( (hbatt(ji,jj)- rn_hc ) / rn_efold ) 2663 ELSE 2664 zsmth = 1.0_wp 2665 ENDIF 2666 2667 DO jk = 1, jpk 2668 z_gsigw3(ji,jj,jk) = REAL(jk-1,wp) /REAL(jpk-1,wp) 2669 z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5_wp)/REAL(jpk-1,wp) 2670 ENDDO 2671 z_gsigw3(ji,jj,:) = fgamma( z_gsigw3(ji,jj,:), zzb, zzs, zsmth ) 2672 z_gsigt3(ji,jj,:) = fgamma( z_gsigt3(ji,jj,:), zzb, zzs, zsmth ) 2673 2674 ELSE IF (ln_sigcrit) THEN ! shallow water, uniform sigma 2675 2676 DO jk = 1, jpk 2677 z_gsigw3(ji,jj,jk) = REAL(jk-1,wp) /REAL(jpk-1,wp) 2678 z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5)/REAL(jpk-1,wp) 2679 END DO 2680 2681 ELSE ! shallow water, z coordinates 2682 2683 DO jk = 1, jpk 2684 z_gsigw3(ji,jj,jk) = REAL(jk-1,wp) /REAL(jpk-1,wp)*(rn_hc/hbatt(ji,jj)) 2685 z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5_wp)/REAL(jpk-1,wp)*(rn_hc/hbatt(ji,jj)) 2686 END DO 2687 2688 ENDIF 2689 2690 DO jk = 1, jpkm1 2691 z_esigt3(ji,jj,jk) = z_gsigw3(ji,jj,jk+1) - z_gsigw3(ji,jj,jk) 2692 z_esigw3(ji,jj,jk+1) = z_gsigt3(ji,jj,jk+1) - z_gsigt3(ji,jj,jk) 2693 END DO 2694 z_esigw3(ji,jj,1 ) = 2.0_wp * (z_gsigt3(ji,jj,1 ) - z_gsigw3(ji,jj,1 )) 2695 z_esigt3(ji,jj,jpk) = 2.0_wp * (z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk)) 2696 2697 ! Coefficients for vertical depth as the sum of e3w scale factors 2698 z_gsi3w3(ji,jj,1) = 0.5 * z_esigw3(ji,jj,1) 2699 DO jk = 2, jpk 2700 z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk) 2701 END DO 2702 2703 DO jk = 1, jpk 2704 gdept_0(ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigt3(ji,jj,jk) 2705 gdepw_0(ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigw3(ji,jj,jk) 2706 gde3w_0(ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsi3w3(ji,jj,jk) 2707 END DO 2708 2709 ENDDO ! for all jj's 2710 ENDDO ! for all ji's 2711 2712 DO ji=1,jpi-1 2713 DO jj=1,jpj-1 2714 2715 ! extend to suit for Wetting/Drying case 2716 ztmpu = hbatt(ji,jj)+hbatt(ji+1,jj) 2717 ztmpv = hbatt(ji,jj)+hbatt(ji,jj+1) 2718 ztmpf = hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) 2719 ztmpu1 = hbatt(ji,jj)*hbatt(ji+1,jj) 2720 ztmpv1 = hbatt(ji,jj)*hbatt(ji,jj+1) 2721 ztmpf1 = MIN(hbatt(ji,jj), hbatt(ji+1,jj), hbatt(ji,jj+1), hbatt(ji+1,jj+1)) * & 2722 & MAX(hbatt(ji,jj), hbatt(ji+1,jj), hbatt(ji,jj+1), hbatt(ji+1,jj+1)) 2723 DO jk = 1, jpk 2724 IF( ln_wd .AND. (ztmpu1 < 0._wp.OR.ABS(ztmpu) < rn_wdmin1) ) THEN 2725 z_esigtu3(ji,jj,jk) = 0.5_wp * ( z_esigt3(ji,jj,jk) + z_esigt3(ji+1,jj,jk) ) 2726 z_esigwu3(ji,jj,jk) = 0.5_wp * ( z_esigw3(ji,jj,jk) + z_esigw3(ji+1,jj,jk) ) 2727 ELSE 2728 z_esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) ) & 2729 & / ztmpu 2730 z_esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigw3(ji+1,jj,jk) ) & 2731 & / ztmpu 2732 END IF 2733 2734 IF( ln_wd .AND. (ztmpv1 < 0._wp.OR.ABS(ztmpv) < rn_wdmin1) ) THEN 2735 z_esigtv3(ji,jj,jk) = 0.5_wp * ( z_esigt3(ji,jj,jk) + z_esigt3(ji,jj+1,jk) ) 2736 z_esigwv3(ji,jj,jk) = 0.5_wp * ( z_esigw3(ji,jj,jk) + z_esigw3(ji,jj+1,jk) ) 2737 ELSE 2738 z_esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk) ) & 2739 & / ztmpv 2740 z_esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigw3(ji,jj+1,jk) ) & 2741 & / ztmpv 2742 END IF 2743 2744 IF( ln_wd .AND. (ztmpf1 < 0._wp.OR.ABS(ztmpf) < rn_wdmin1) ) THEN 2745 z_esigtf3(ji,jj,jk) = 0.25_wp * ( z_esigt3(ji,jj,jk) + z_esigt3(ji+1,jj,jk) & 2746 & + z_esigt3(ji,jj+1,jk) + z_esigt3(ji+1,jj+1,jk) ) 2747 ELSE 2748 z_esigtf3(ji,jj,jk) = ( hbatt(ji ,jj )*z_esigt3(ji ,jj ,jk) & 2749 & + hbatt(ji+1,jj )*z_esigt3(ji+1,jj ,jk) & 2750 & + hbatt(ji ,jj+1)*z_esigt3(ji ,jj+1,jk) & 2751 & + hbatt(ji+1,jj+1)*z_esigt3(ji+1,jj+1,jk) ) / ztmpf 2752 END IF 2753 2754 ! Code prior to wetting and drying option (for reference) 2755 !z_esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) ) & 2756 ! /( hbatt(ji,jj)+hbatt(ji+1,jj) ) 2757 ! 2758 !z_esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigw3(ji+1,jj,jk) ) & 2759 ! /( hbatt(ji,jj)+hbatt(ji+1,jj) ) 2760 ! 2761 !z_esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk) ) & 2762 ! /( hbatt(ji,jj)+hbatt(ji,jj+1) ) 2763 ! 2764 !z_esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigw3(ji,jj+1,jk) ) & 2765 ! /( hbatt(ji,jj)+hbatt(ji,jj+1) ) 2766 ! 2767 !z_esigtf3(ji,jj,jk) = ( hbatt(ji ,jj )*z_esigt3(ji ,jj ,jk) & 2768 ! & +hbatt(ji+1,jj )*z_esigt3(ji+1,jj ,jk) & 2769 ! +hbatt(ji ,jj+1)*z_esigt3(ji ,jj+1,jk) & 2770 ! & +hbatt(ji+1,jj+1)*z_esigt3(ji+1,jj+1,jk) ) & 2771 ! /( hbatt(ji ,jj )+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 2772 2773 e3t_0(ji,jj,jk)=(scosrf(ji,jj)+hbatt(ji,jj))*z_esigt3(ji,jj,jk) 2774 e3u_0(ji,jj,jk)=(scosrf(ji,jj)+hbatu(ji,jj))*z_esigtu3(ji,jj,jk) 2775 e3v_0(ji,jj,jk)=(scosrf(ji,jj)+hbatv(ji,jj))*z_esigtv3(ji,jj,jk) 2776 e3f_0(ji,jj,jk)=(scosrf(ji,jj)+hbatf(ji,jj))*z_esigtf3(ji,jj,jk) 2777 ! 2778 e3w_0 (ji,jj,jk)=hbatt(ji,jj)*z_esigw3(ji,jj,jk) 2779 e3uw_0(ji,jj,jk)=hbatu(ji,jj)*z_esigwu3(ji,jj,jk) 2780 e3vw_0(ji,jj,jk)=hbatv(ji,jj)*z_esigwv3(ji,jj,jk) 2781 END DO 2782 2783 ENDDO 2784 ENDDO 2785 ! 2786 CALL lbc_lnk(e3t_0 ,'T',1.) ; CALL lbc_lnk(e3u_0 ,'T',1.) 2787 CALL lbc_lnk(e3v_0 ,'T',1.) ; CALL lbc_lnk(e3f_0 ,'T',1.) 2788 CALL lbc_lnk(e3w_0 ,'T',1.) 2789 CALL lbc_lnk(e3uw_0,'T',1.) ; CALL lbc_lnk(e3vw_0,'T',1.) 2790 ! 2791 CALL wrk_dealloc( jpi,jpj,jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 2792 CALL wrk_dealloc( jpi,jpj,jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 2793 ! 2794 END SUBROUTINE s_sf12 2795 2796 2797 SUBROUTINE s_tanh() 2798 !!---------------------------------------------------------------------- 2799 !! *** ROUTINE s_tanh*** 2800 !! 2801 !! ** Purpose : stretch the s-coordinate system 2802 !! 2803 !! ** Method : s-coordinate stretch 2804 !! 2805 !! Reference : Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408. 2806 !!---------------------------------------------------------------------- 2807 INTEGER :: ji, jj, jk ! dummy loop argument 2808 REAL(wp) :: zcoeft, zcoefw ! temporary scalars 2809 REAL(wp), POINTER, DIMENSION(:) :: z_gsigw, z_gsigt, z_gsi3w 2810 REAL(wp), POINTER, DIMENSION(:) :: z_esigt, z_esigw 2811 !!---------------------------------------------------------------------- 2812 2813 CALL wrk_alloc( jpk, z_gsigw, z_gsigt, z_gsi3w ) 2814 CALL wrk_alloc( jpk, z_esigt, z_esigw ) 2815 2816 z_gsigw = 0._wp ; z_gsigt = 0._wp ; z_gsi3w = 0._wp 2817 z_esigt = 0._wp ; z_esigw = 0._wp 2818 2819 DO jk = 1, jpk 2820 z_gsigw(jk) = -fssig( REAL(jk,wp)-0.5_wp ) 2821 z_gsigt(jk) = -fssig( REAL(jk,wp) ) 2822 END DO 2823 IF( nprint == 1 .AND. lwp ) WRITE(numout,*) 'z_gsigw 1 jpk ', z_gsigw(1), z_gsigw(jpk) 2824 ! 2825 ! Coefficients for vertical scale factors at w-, t- levels 2826 !!gm bug : define it from analytical function, not like juste bellow.... 2827 !!gm or betteroffer the 2 possibilities.... 2828 DO jk = 1, jpkm1 2829 z_esigt(jk ) = z_gsigw(jk+1) - z_gsigw(jk) 2830 z_esigw(jk+1) = z_gsigt(jk+1) - z_gsigt(jk) 2831 END DO 2832 z_esigw( 1 ) = 2._wp * ( z_gsigt(1 ) - z_gsigw(1 ) ) 2833 z_esigt(jpk) = 2._wp * ( z_gsigt(jpk) - z_gsigw(jpk) ) 2834 ! 2835 ! Coefficients for vertical depth as the sum of e3w scale factors 2836 z_gsi3w(1) = 0.5_wp * z_esigw(1) 2837 DO jk = 2, jpk 2838 z_gsi3w(jk) = z_gsi3w(jk-1) + z_esigw(jk) 2839 END DO 2840 !!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays) 2841 DO jk = 1, jpk 2842 zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 2843 zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 2844 gdept_0(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigt(jk) + hift(:,:)*zcoeft ) 2845 gdepw_0(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigw(jk) + hift(:,:)*zcoefw ) 2846 gde3w_0(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsi3w(jk) + hift(:,:)*zcoeft ) 2847 END DO 2848 !!gm: e3uw, e3vw can be suppressed (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 2849 DO jj = 1, jpj 2850 DO ji = 1, jpi 2851 DO jk = 1, jpk 2852 e3t_0(ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*z_esigt(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 2853 e3u_0(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*z_esigt(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 2854 e3v_0(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*z_esigt(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 2855 e3f_0(ji,jj,jk) = ( (hbatf(ji,jj)-hiff(ji,jj))*z_esigt(jk) + hiff(ji,jj)/REAL(jpkm1,wp) ) 2856 ! 2857 e3w_0 (ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*z_esigw(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 2858 e3uw_0(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*z_esigw(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 2859 e3vw_0(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*z_esigw(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 2860 END DO 2861 END DO 2862 END DO 2863 ! 2864 CALL wrk_dealloc( jpk, z_gsigw, z_gsigt, z_gsi3w ) 2865 CALL wrk_dealloc( jpk, z_esigt, z_esigw ) 2866 ! 2867 END SUBROUTINE s_tanh 2868 2869 2870 FUNCTION fssig( pk ) RESULT( pf ) 2871 !!---------------------------------------------------------------------- 2872 !! *** ROUTINE fssig *** 2873 !! 2874 !! ** Purpose : provide the analytical function in s-coordinate 2875 !! 2876 !! ** Method : the function provide the non-dimensional position of 2877 !! T and W (i.e. between 0 and 1) 2878 !! T-points at integer values (between 1 and jpk) 2879 !! W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 2880 !!---------------------------------------------------------------------- 2881 REAL(wp), INTENT(in) :: pk ! continuous "k" coordinate 2882 REAL(wp) :: pf ! sigma value 2883 !!---------------------------------------------------------------------- 2884 ! 2885 pf = ( TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb ) ) & 2886 & - TANH( rn_thetb * rn_theta ) ) & 2887 & * ( COSH( rn_theta ) & 2888 & + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) ) ) & 2889 & / ( 2._wp * SINH( rn_theta ) ) 2890 ! 2891 END FUNCTION fssig 2892 2893 2894 FUNCTION fssig1( pk1, pbb ) RESULT( pf1 ) 2895 !!---------------------------------------------------------------------- 2896 !! *** ROUTINE fssig1 *** 2897 !! 2898 !! ** Purpose : provide the Song and Haidvogel version of the analytical function in s-coordinate 2899 !! 2900 !! ** Method : the function provides the non-dimensional position of 2901 !! T and W (i.e. between 0 and 1) 2902 !! T-points at integer values (between 1 and jpk) 2903 !! W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 2904 !!---------------------------------------------------------------------- 2905 REAL(wp), INTENT(in) :: pk1 ! continuous "k" coordinate 2906 REAL(wp), INTENT(in) :: pbb ! Stretching coefficient 2907 REAL(wp) :: pf1 ! sigma value 2908 !!---------------------------------------------------------------------- 2909 ! 2910 IF ( rn_theta == 0 ) then ! uniform sigma 2911 pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 ) 2912 ELSE ! stretched sigma 2913 pf1 = ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta ) & 2914 & + pbb * ( (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta ) ) & 2915 & / ( 2._wp * TANH( 0.5_wp * rn_theta ) ) ) 2916 ENDIF 2917 ! 2918 END FUNCTION fssig1 2919 2920 2921 FUNCTION fgamma( pk1, pzb, pzs, psmth) RESULT( p_gamma ) 2922 !!---------------------------------------------------------------------- 2923 !! *** ROUTINE fgamma *** 2924 !! 2925 !! ** Purpose : provide analytical function for the s-coordinate 2926 !! 2927 !! ** Method : the function provides the non-dimensional position of 2928 !! T and W (i.e. between 0 and 1) 2929 !! T-points at integer values (between 1 and jpk) 2930 !! W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 2931 !! 2932 !! This method allows the maintenance of fixed surface and or 2933 !! bottom cell resolutions (cf. geopotential coordinates) 2934 !! within an analytically derived stretched S-coordinate framework. 2935 !! 2936 !! Reference : Siddorn and Furner, in prep 2937 !!---------------------------------------------------------------------- 2938 REAL(wp), INTENT(in ) :: pk1(jpk) ! continuous "k" coordinate 2939 REAL(wp) :: p_gamma(jpk) ! stretched coordinate 2940 REAL(wp), INTENT(in ) :: pzb ! Bottom box depth 2941 REAL(wp), INTENT(in ) :: pzs ! surface box depth 2942 REAL(wp), INTENT(in ) :: psmth ! Smoothing parameter 2943 ! 2944 INTEGER :: jk ! dummy loop index 2945 REAL(wp) :: za1,za2,za3 ! local scalar 2946 REAL(wp) :: zn1,zn2 ! - - 2947 REAL(wp) :: za,zb,zx ! - - 2948 !!---------------------------------------------------------------------- 2949 ! 2950 zn1 = 1._wp / REAL( jpkm1, wp ) 2951 zn2 = 1._wp - zn1 2952 ! 2953 za1 = (rn_alpha+2.0_wp)*zn1**(rn_alpha+1.0_wp)-(rn_alpha+1.0_wp)*zn1**(rn_alpha+2.0_wp) 2954 za2 = (rn_alpha+2.0_wp)*zn2**(rn_alpha+1.0_wp)-(rn_alpha+1.0_wp)*zn2**(rn_alpha+2.0_wp) 2955 za3 = (zn2**3.0_wp - za2)/( zn1**3.0_wp - za1) 2956 ! 2957 za = pzb - za3*(pzs-za1)-za2 2958 za = za/( zn2-0.5_wp*(za2+zn2**2.0_wp) - za3*(zn1-0.5_wp*(za1+zn1**2.0_wp) ) ) 2959 zb = (pzs - za1 - za*( zn1-0.5_wp*(za1+zn1**2.0_wp ) ) ) / (zn1**3.0_wp - za1) 2960 zx = 1.0_wp-za/2.0_wp-zb 2961 ! 2962 DO jk = 1, jpk 2963 p_gamma(jk) = za*(pk1(jk)*(1.0_wp-pk1(jk)/2.0_wp))+zb*pk1(jk)**3.0_wp + & 2964 & zx*( (rn_alpha+2.0_wp)*pk1(jk)**(rn_alpha+1.0_wp)- & 2965 & (rn_alpha+1.0_wp)*pk1(jk)**(rn_alpha+2.0_wp) ) 2966 p_gamma(jk) = p_gamma(jk)*psmth+pk1(jk)*(1.0_wp-psmth) 2967 END DO 2968 ! 2969 END FUNCTION fgamma 310 zk(:,:) = REAL( miku(:,:), wp ) ; CALL lbc_lnk( zk, 'U', 1. ) ; miku(:,:) = MAX( INT( zk(:,:) ), 1 ) 311 zk(:,:) = REAL( mikv(:,:), wp ) ; CALL lbc_lnk( zk, 'V', 1. ) ; mikv(:,:) = MAX( INT( zk(:,:) ), 1 ) 312 zk(:,:) = REAL( mikf(:,:), wp ) ; CALL lbc_lnk( zk, 'F', 1. ) ; mikf(:,:) = MAX( INT( zk(:,:) ), 1 ) 313 ! 314 zk(:,:) = REAL( mbku(:,:), wp ) ; CALL lbc_lnk( zk, 'U', 1. ) ; mbku(:,:) = MAX( INT( zk(:,:) ), 1 ) 315 zk(:,:) = REAL( mbkv(:,:), wp ) ; CALL lbc_lnk( zk, 'V', 1. ) ; mbkv(:,:) = MAX( INT( zk(:,:) ), 1 ) 316 ! 317 CALL wrk_dealloc( jpi,jpj, zk ) 318 ! 319 IF( nn_timing == 1 ) CALL timing_stop('zgr_top_bot') 320 ! 321 END SUBROUTINE zgr_top_bot 2970 322 2971 323 !!====================================================================== -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/dtatsd.F90
r6140 r7421 53 53 LOGICAL, INTENT(in), OPTIONAL :: ld_tradmp ! force the initialization when tradp is used 54 54 ! 55 INTEGER :: i err0, ierr1, ierr2, ierr3 ! temporaryintegers56 ! 55 INTEGER :: ios, ierr0, ierr1, ierr2, ierr3 ! local integers 56 !! 57 57 CHARACTER(len=100) :: cn_dir ! Root directory for location of ssr files 58 58 TYPE(FLD_N), DIMENSION( jpts) :: slf_i ! array of namelist informations on the fields to read … … 60 60 !! 61 61 NAMELIST/namtsd/ ln_tsd_init, ln_tsd_tradmp, cn_dir, sn_tem, sn_sal 62 INTEGER :: ios63 62 !!---------------------------------------------------------------------- 64 63 ! … … 117 116 ! ! fill sf_tsd with sn_tem & sn_sal and control print 118 117 slf_i(jp_tem) = sn_tem ; slf_i(jp_sal) = sn_sal 119 CALL fld_fill( sf_tsd, slf_i, cn_dir, 'dta_tsd', 'Temperature & Salinity data', 'namtsd' )118 CALL fld_fill( sf_tsd, slf_i, cn_dir, 'dta_tsd', 'Temperature & Salinity data', 'namtsd', no_print ) 120 119 ! 121 120 ENDIF … … 155 154 ! 156 155 ! 156 !!gm This should be removed from the code ===>>>> T & S files has to be changed 157 ! 157 158 ! !== ORCA_R2 configuration and T & S damping ==! 158 IF( c p_cfg == "orca" .AND. jp_cfg == 2 .AND. ln_tsd_tradmp ) THEN ! some hand made alterations159 IF( cn_cfg == "orca" .AND. nn_cfg == 2 .AND. ln_tsd_tradmp ) THEN ! some hand made alterations 159 160 ! 160 161 ij0 = 101 ; ij1 = 109 ! Reduced T & S in the Alboran Sea … … 178 179 sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 14:20 ) = 6.0_wp 179 180 ENDIF 181 !!gm end 180 182 ! 181 183 ptsd(:,:,:,jp_tem) = sf_tsd(jp_tem)%fnow(:,:,:) ! NO mask -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/iscplhsb.F90
r6140 r7421 1 1 MODULE iscplhsb 2 2 !!====================================================================== 3 !! *** MODULE iscplhsb ***3 !! *** MODULE iscplhsb *** 4 4 !! Ocean forcing: ice sheet/ocean coupling (conservation) 5 5 !!===================================================================== -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/iscplini.F90
r6140 r7421 1 1 MODULE iscplini 2 2 !!====================================================================== 3 !! *** MODULE sbciscpl ***3 !! *** MODULE sbciscpl *** 4 4 !! Ocean forcing: river runoff 5 5 !!===================================================================== -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/iscplrst.F90
r6140 r7421 1 1 MODULE iscplrst 2 2 !!====================================================================== 3 !! *** MODULE iscplrst ***3 !! *** MODULE iscplrst *** 4 4 !! Ocean forcing: update the restart file in case of ice sheet/ocean coupling 5 5 !!===================================================================== … … 50 50 !!---------------------------------------------------------------------- 51 51 INTEGER :: inum0 52 REAL(wp), DIMENSION(:,: ), POINTER :: zsmask_b53 REAL(wp), DIMENSION(:,:,:), POINTER :: ztmask_b, zumask_b, zvmask_b54 REAL(wp), DIMENSION(:,:,:), POINTER :: ze3t_b , ze3u_b , ze3v_b55 REAL(wp), DIMENSION(:,:,:), POINTER :: zdepw_b52 REAL(wp), DIMENSION(:,: ), POINTER :: zsmask_b 53 REAL(wp), DIMENSION(:,:,:), POINTER :: ztmask_b, zumask_b, zvmask_b 54 REAL(wp), DIMENSION(:,:,:), POINTER :: ze3t_b , ze3u_b , ze3v_b 55 REAL(wp), DIMENSION(:,:,:), POINTER :: zdepw_b 56 56 CHARACTER(20) :: cfile 57 57 !!---------------------------------------------------------------------- 58 58 59 CALL wrk_alloc(jpi,jpj,jpk, ztmask_b, zumask_b, zvmask_b) ! mask before60 CALL wrk_alloc(jpi,jpj,jpk, ze3t_b , ze3u_b , ze3v_b ) ! e3 before61 CALL wrk_alloc(jpi,jpj,jpk, zdepw_b )62 CALL wrk_alloc(jpi,jpj, zsmask_b )59 CALL wrk_alloc(jpi,jpj,jpk, ztmask_b, zumask_b, zvmask_b) ! mask before 60 CALL wrk_alloc(jpi,jpj,jpk, ze3t_b , ze3u_b , ze3v_b ) ! e3 before 61 CALL wrk_alloc(jpi,jpj,jpk, zdepw_b ) 62 CALL wrk_alloc(jpi,jpj, zsmask_b ) 63 63 64 64 … … 86 86 87 87 !! print mesh/mask 88 IF( n msh /= 0 .AND. ln_iscpl ) CALL dom_wri ! Create a domain file88 IF( nn_msh /= 0 .AND. ln_iscpl ) CALL dom_wri ! Create a domain file 89 89 90 90 IF ( ln_hsb ) THEN … … 98 98 END IF 99 99 100 CALL wrk_dealloc(jpi,jpj,jpk, ztmask_b,zumask_b,zvmask_b )101 CALL wrk_dealloc(jpi,jpj,jpk, ze3t_b ,ze3u_b ,ze3v_b )102 CALL wrk_dealloc(jpi,jpj,jpk, zdepw_b )103 CALL wrk_dealloc(jpi,jpj, zsmask_b )100 CALL wrk_dealloc(jpi,jpj,jpk, ztmask_b,zumask_b,zvmask_b ) 101 CALL wrk_dealloc(jpi,jpj,jpk, ze3t_b ,ze3u_b ,ze3v_b ) 102 CALL wrk_dealloc(jpi,jpj,jpk, zdepw_b ) 103 CALL wrk_dealloc(jpi,jpj, zsmask_b ) 104 104 105 105 !! next step is an euler time step … … 108 108 !! set _b and _n variables equal 109 109 tsb (:,:,:,:) = tsn (:,:,:,:) 110 ub (:,:,: ) = un (:,:,:)111 vb (:,:,: ) = vn (:,:,:)112 sshb(:,: )= sshn(:,:)110 ub (:,:,:) = un (:,:,:) 111 vb (:,:,:) = vn (:,:,:) 112 sshb(:,:) = sshn(:,:) 113 113 114 114 !! set _b and _n vertical scale factor equal … … 117 117 e3v_b (:,:,:) = e3v_n (:,:,:) 118 118 119 e3uw_b (:,:,:) = e3uw_n(:,:,:)120 e3vw_b (:,:,:) = e3vw_n(:,:,:)121 gdept_b(:,:,:) 119 e3uw_b (:,:,:) = e3uw_n (:,:,:) 120 e3vw_b (:,:,:) = e3vw_n (:,:,:) 121 gdept_b(:,:,:) = gdept_n(:,:,:) 122 122 gdepw_b(:,:,:) = gdepw_n(:,:,:) 123 hu_b (:,:) = hu_n(:,:)124 hv_b (:,:) = hv_n(:,:)125 r1_hu_b(:,:) = r1_hu_n(:,:)126 r1_hv_b(:,:) = r1_hv_n(:,:)123 hu_b (:,:) = hu_n (:,:) 124 hv_b (:,:) = hv_n (:,:) 125 r1_hu_b(:,:) = r1_hu_n(:,:) 126 r1_hv_b(:,:) = r1_hv_n(:,:) 127 127 ! 128 128 END SUBROUTINE iscpl_stp 129 129 130 130 131 SUBROUTINE iscpl_rst_interpol (ptmask_b, pumask_b, pvmask_b, psmask_b, pe3t_b, pe3u_b, pe3v_b, pdepw_b) 131 132 !!---------------------------------------------------------------------- … … 436 437 CALL wrk_dealloc(jpi,jpj, zbub , zbvb , zbun , zbvn ) 437 438 CALL wrk_dealloc(jpi,jpj, zssh0 , zssh1 , zhu1 , zhv1 ) 438 439 ! 439 440 END SUBROUTINE iscpl_rst_interpol 440 441 442 !!====================================================================== 441 443 END MODULE iscplrst -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90
r7412 r7421 14 14 !! 3.3 ! 2010-10 (C. Ethe) merge TRC-TRA 15 15 !! 3.4 ! 2011-04 (G. Madec) Merge of dtatem and dtasal & suppression of tb,tn/sb,sn 16 !! 3.7 ! 2016-04 (S. Flavoni) introduce user defined initial state 16 17 !!---------------------------------------------------------------------- 17 18 18 19 !!---------------------------------------------------------------------- 19 20 !! istate_init : initial state setting 20 !! istate_tem : analytical profile for initial Temperature21 !! istate_sal : analytical profile for initial Salinity22 !! istate_eel : initial state setting of EEL R5 configuration23 !! istate_gyre : initial state setting of GYRE configuration24 21 !! istate_uvg : initial velocity in geostropic balance 25 22 !!---------------------------------------------------------------------- 26 USE oce ! ocean dynamics and active tracers 27 USE dom_oce ! ocean space and time domain 28 USE c1d ! 1D vertical configuration 29 USE daymod ! calendar 30 USE eosbn2 ! eq. of state, Brunt Vaisala frequency (eos routine) 31 USE ldftra ! lateral physics: ocean active tracers 32 USE zdf_oce ! ocean vertical physics 33 USE phycst ! physical constants 34 USE dtatsd ! data temperature and salinity (dta_tsd routine) 35 USE dtauvd ! data: U & V current (dta_uvd routine) 23 USE oce ! ocean dynamics and active tracers 24 USE dom_oce ! ocean space and time domain 25 USE daymod ! calendar 26 USE divhor ! horizontal divergence (div_hor routine) 27 USE dtatsd ! data temperature and salinity (dta_tsd routine) 28 USE dtauvd ! data: U & V current (dta_uvd routine) 36 29 USE domvvl ! varying vertical mesh 37 30 USE iscplrst ! ice sheet coupling 38 31 USE wet_dry ! wetting and drying (needed for wad_istate) 32 USE usrdef_istate ! User defined initial state 39 33 ! 40 34 USE in_out_manager ! I/O manager … … 71 65 IF( nn_timing == 1 ) CALL timing_start('istate_init') 72 66 ! 67 IF(lwp) WRITE(numout,*) 68 IF(lwp) WRITE(numout,*) 'istate_init : Initialization of the dynamics and tracers' 69 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 73 70 74 IF(lwp) WRITE(numout,*) 75 IF(lwp) WRITE(numout,*) 'istate_ini : Initialization of the dynamics and tracers' 76 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 77 71 !!gm Why not include in the first call of dta_tsd ? 72 !!gm probably associated with the use of internal damping... 78 73 CALL dta_tsd_init ! Initialisation of T & S input data 79 IF( lk_c1d ) CALL dta_uvd_init ! Initialization of U & V input data 74 !!gm to be moved in usrdef of C1D case 75 ! IF( lk_c1d ) CALL dta_uvd_init ! Initialization of U & V input data 76 !!gm 80 77 81 78 rhd (:,:,: ) = 0._wp ; rhop (:,:,: ) = 0._wp ! set one for all to 0 at level jpk … … 87 84 ! ! ------------------- 88 85 CALL rst_read ! Read the restart file 89 IF (ln_iscpl) CALL iscpl_stp ! extra loate restart to wet and dry86 IF (ln_iscpl) CALL iscpl_stp ! extrapolate restart to wet and dry 90 87 CALL day_init ! model calendar (using both namelist and restart infos) 91 ELSE92 !! Start from rest88 ! 89 ELSE ! Start from rest 93 90 ! ! --------------- 94 numror = 0 ! define numror = 0 -> no restart file to read 95 neuler = 0 ! Set time-step indicator at nit000 (euler forward) 96 CALL day_init ! model calendar (using both namelist and restart infos) 97 ! ! Initialization of ocean to zero 98 ! before fields ! now fields 99 sshb (:,:) = 0._wp ; sshn (:,:) = 0._wp 100 ub (:,:,:) = 0._wp ; un (:,:,:) = 0._wp 101 vb (:,:,:) = 0._wp ; vn (:,:,:) = 0._wp 102 hdivn(:,:,:) = 0._wp 91 numror = 0 ! define numror = 0 -> no restart file to read 92 neuler = 0 ! Set time-step indicator at nit000 (euler forward) 93 CALL day_init ! model calendar (using both namelist and restart infos) 94 ! ! Initialization of ocean to zero 103 95 ! 104 IF( cp_cfg == 'eel' ) THEN 105 CALL istate_eel ! EEL configuration : start from pre-defined U,V T-S fields 106 ELSEIF( cp_cfg == 'gyre' ) THEN 107 CALL istate_gyre ! GYRE configuration : start from pre-defined T-S fields 108 ELSEIF( cp_cfg == 'wad' ) THEN 109 CALL wad_istate ! WAD test configuration : start from pre-defined T-S fields and initial ssh slope 110 ELSE ! Initial T-S, U-V fields read in files 111 IF ( ln_tsd_init ) THEN ! read 3D T and S data at nit000 112 CALL dta_tsd( nit000, tsb ) 113 tsn(:,:,:,:) = tsb(:,:,:,:) 114 ! 115 ELSE ! Initial T-S fields defined analytically 116 CALL istate_t_s 117 ENDIF 118 IF ( ln_uvd_init .AND. lk_c1d ) THEN ! read 3D U and V data at nit000 119 CALL wrk_alloc( jpi,jpj,jpk,2, zuvd ) 120 CALL dta_uvd( nit000, zuvd ) 121 ub(:,:,:) = zuvd(:,:,:,1) ; un(:,:,:) = ub(:,:,:) 122 vb(:,:,:) = zuvd(:,:,:,2) ; vn(:,:,:) = vb(:,:,:) 123 CALL wrk_dealloc( jpi,jpj,jpk,2, zuvd ) 124 ENDIF 96 IF( ln_tsd_init ) THEN 97 CALL dta_tsd( nit000, tsb ) ! read 3D T and S data at nit000 98 ! 99 sshb(:,:) = 0._wp ! set the ocean at rest 100 ub (:,:,:) = 0._wp 101 vb (:,:,:) = 0._wp 102 ! 103 ELSE ! user defined initial T and S 104 CALL usr_def_istate( gdept_b, tmask, tsb, ub, vb, sshb ) 125 105 ENDIF 106 tsn (:,:,:,:) = tsb (:,:,:,:) ! set now values from to before ones 107 sshn (:,:) = sshb(:,:) 108 un (:,:,:) = ub (:,:,:) 109 vn (:,:,:) = vb (:,:,:) 110 hdivn(:,:,jpk) = 0._wp ! bottom divergence set one for 0 to zero at jpk level 111 CALL div_hor( 0 ) ! compute interior hdivn value 112 !!gm hdivn(:,:,:) = 0._wp 113 114 !!gm POTENTIAL BUG : 115 !!gm ISSUE : if sshb /= 0 then, in non linear free surface, the e3._n, e3._b should be recomputed 116 !! as well as gdept and gdepw.... !!!!! 117 !! ===>>>> probably a call to domvvl initialisation here.... 118 119 120 ! 121 !!gm to be moved in usrdef of C1D case 122 ! IF ( ln_uvd_init .AND. lk_c1d ) THEN ! read 3D U and V data at nit000 123 ! CALL wrk_alloc( jpi,jpj,jpk,2, zuvd ) 124 ! CALL dta_uvd( nit000, zuvd ) 125 ! ub(:,:,:) = zuvd(:,:,:,1) ; un(:,:,:) = ub(:,:,:) 126 ! vb(:,:,:) = zuvd(:,:,:,2) ; vn(:,:,:) = vb(:,:,:) 127 ! CALL wrk_dealloc( jpi,jpj,jpk,2, zuvd ) 128 ! ENDIF 126 129 ! 127 130 !!gm This is to be changed !!!! 128 ! - ML - sshn could be modified by istate_eel, so that initialization of e3t_b is done here129 IF( .NOT.ln_linssh ) THEN130 DO jk = 1, jpk131 e3t_b(:,:,jk) = e3t_n(:,:,jk)132 END DO133 ENDIF131 ! ! - ML - sshn could be modified by istate_eel, so that initialization of e3t_b is done here 132 ! IF( .NOT.ln_linssh ) THEN 133 ! DO jk = 1, jpk 134 ! e3t_b(:,:,jk) = e3t_n(:,:,jk) 135 ! END DO 136 ! ENDIF 134 137 !!gm 135 138 ! 136 ENDIF 139 ENDIF 137 140 ! 138 141 ! Initialize "now" and "before" barotropic velocities: … … 142 145 ub_b(:,:) = 0._wp ; vb_b(:,:) = 0._wp 143 146 ! 144 !!gm the use of umsak & vmask is not necessary belo xas un, vn, ub, vb are always masked147 !!gm the use of umsak & vmask is not necessary below as un, vn, ub, vb are always masked 145 148 DO jk = 1, jpkm1 146 149 DO jj = 1, jpj … … 165 168 END SUBROUTINE istate_init 166 169 167 168 SUBROUTINE istate_t_s 169 !!--------------------------------------------------------------------- 170 !! *** ROUTINE istate_t_s *** 171 !! 172 !! ** Purpose : Intialization of the temperature field with an 173 !! analytical profile or a file (i.e. in EEL configuration) 174 !! 175 !! ** Method : - temperature: use Philander analytic profile 176 !! - salinity : use to a constant value 35.5 177 !! 178 !! References : Philander ??? 179 !!---------------------------------------------------------------------- 180 INTEGER :: ji, jj, jk 181 REAL(wp) :: zsal = 35.50_wp 182 !!---------------------------------------------------------------------- 183 ! 184 IF(lwp) WRITE(numout,*) 185 IF(lwp) WRITE(numout,*) 'istate_t_s : Philander s initial temperature profile' 186 IF(lwp) WRITE(numout,*) '~~~~~~~~~~ and constant salinity (',zsal,' psu)' 187 ! 188 DO jk = 1, jpk 189 tsn(:,:,jk,jp_tem) = ( ( ( 7.5 - 0. * ABS( gphit(:,:) )/30. ) * ( 1.-TANH((gdept_n(:,:,jk)-80.)/30.) ) & 190 & + 10. * ( 5000. - gdept_n(:,:,jk) ) /5000.) ) * tmask(:,:,jk) 191 tsb(:,:,jk,jp_tem) = tsn(:,:,jk,jp_tem) 192 END DO 193 tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 194 tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 195 ! 196 END SUBROUTINE istate_t_s 197 198 199 SUBROUTINE istate_eel 200 !!---------------------------------------------------------------------- 201 !! *** ROUTINE istate_eel *** 202 !! 203 !! ** Purpose : Initialization of the dynamics and tracers for EEL R5 204 !! configuration (channel with or without a topographic bump) 205 !! 206 !! ** Method : - set temprature field 207 !! - set salinity field 208 !! - set velocity field including horizontal divergence 209 !! and relative vorticity fields 210 !!---------------------------------------------------------------------- 211 USE divhor ! hor. divergence (div_hor routine) 212 USE iom 213 ! 214 INTEGER :: inum ! temporary logical unit 215 INTEGER :: ji, jj, jk ! dummy loop indices 216 INTEGER :: ijloc 217 REAL(wp) :: zh1, zh2, zslope, zcst, zfcor ! temporary scalars 218 REAL(wp) :: zt1 = 15._wp ! surface temperature value (EEL R5) 219 REAL(wp) :: zt2 = 5._wp ! bottom temperature value (EEL R5) 220 REAL(wp) :: zsal = 35.0_wp ! constant salinity (EEL R2, R5 and R6) 221 REAL(wp) :: zueel = 0.1_wp ! constant uniform zonal velocity (EEL R5) 222 REAL(wp), DIMENSION(jpiglo,jpjglo) :: zssh ! initial ssh over the global domain 223 !!---------------------------------------------------------------------- 224 ! 225 SELECT CASE ( jp_cfg ) 226 ! ! ==================== 227 CASE ( 5 ) ! EEL R5 configuration 228 ! ! ==================== 229 ! 230 ! set temperature field with a linear profile 231 ! ------------------------------------------- 232 IF(lwp) WRITE(numout,*) 233 IF(lwp) WRITE(numout,*) 'istate_eel : EEL R5: linear temperature profile' 234 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 235 ! 236 zh1 = gdept_1d( 1 ) 237 zh2 = gdept_1d(jpkm1) 238 ! 239 zslope = ( zt1 - zt2 ) / ( zh1 - zh2 ) 240 zcst = ( zt1 * ( zh1 - zh2) - ( zt1 - zt2 ) * zh1 ) / ( zh1 - zh2 ) 241 ! 242 DO jk = 1, jpk 243 tsn(:,:,jk,jp_tem) = ( zt2 + zt1 * exp( - gdept_n(:,:,jk) / 1000 ) ) * tmask(:,:,jk) 244 tsb(:,:,jk,jp_tem) = tsn(:,:,jk,jp_tem) 245 END DO 246 ! 247 ! set salinity field to a constant value 248 ! -------------------------------------- 249 IF(lwp) WRITE(numout,*) 250 IF(lwp) WRITE(numout,*) 'istate_eel : EEL R5: constant salinity field, S = ', zsal 251 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 252 ! 253 tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 254 tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 255 ! 256 ! set the dynamics: U,V, hdiv (and ssh if necessary) 257 ! ---------------- 258 ! Start EEL5 configuration with barotropic geostrophic velocities 259 ! according the sshb and sshn SSH imposed. 260 ! we assume a uniform grid (hence the use of e1t(1,1) for delta_y) 261 ! we use the Coriolis frequency at mid-channel. 262 ub(:,:,:) = zueel * umask(:,:,:) 263 un(:,:,:) = ub(:,:,:) 264 ijloc = mj0(INT(jpjglo-1)/2) 265 zfcor = ff(1,ijloc) 266 ! 267 DO jj = 1, jpjglo 268 zssh(:,jj) = - (FLOAT(jj)- FLOAT(jpjglo-1)/2.)*zueel*e1t(1,1)*zfcor/grav 269 END DO 270 ! 271 IF(lwp) THEN 272 WRITE(numout,*) ' Uniform zonal velocity for EEL R5:',zueel 273 WRITE(numout,*) ' Geostrophic SSH profile as a function of y:' 274 WRITE(numout,'(12(1x,f6.2))') zssh(1,:) 275 ENDIF 276 ! 277 DO jj = 1, nlcj 278 DO ji = 1, nlci 279 sshb(ji,jj) = zssh( mig(ji) , mjg(jj) ) * tmask(ji,jj,1) 280 END DO 281 END DO 282 sshb(nlci+1:jpi, : ) = 0.e0 ! set to zero extra mpp columns 283 sshb( : ,nlcj+1:jpj) = 0.e0 ! set to zero extra mpp rows 284 ! 285 sshn(:,:) = sshb(:,:) ! set now ssh to the before value 286 ! 287 IF( nn_rstssh /= 0 ) THEN 288 nn_rstssh = 0 ! hand-made initilization of ssh 289 CALL ctl_warn( 'istate_eel: force nn_rstssh = 0' ) 290 ENDIF 291 ! 292 !!gm Check here call to div_hor should not be necessary 293 !!gm div_hor call runoffs not sure they are defined at that level 294 CALL div_hor( nit000 ) ! horizontal divergence and relative vorticity (curl) 295 ! N.B. the vertical velocity will be computed from the horizontal divergence field 296 ! in istate by a call to wzv routine 297 298 299 ! ! ========================== 300 CASE ( 2 , 6 ) ! EEL R2 or R6 configuration 301 ! ! ========================== 302 ! 303 ! set temperature field with a NetCDF file 304 ! ---------------------------------------- 305 IF(lwp) WRITE(numout,*) 306 IF(lwp) WRITE(numout,*) 'istate_eel : EEL R2 or R6: read initial temperature in a NetCDF file' 307 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 308 ! 309 CALL iom_open ( 'eel.initemp', inum ) 310 CALL iom_get ( inum, jpdom_data, 'initemp', tsb(:,:,:,jp_tem) ) ! read before temprature (tb) 311 CALL iom_close( inum ) 312 ! 313 tsn(:,:,:,jp_tem) = tsb(:,:,:,jp_tem) ! set nox temperature to tb 314 ! 315 ! set salinity field to a constant value 316 ! -------------------------------------- 317 IF(lwp) WRITE(numout,*) 318 IF(lwp) WRITE(numout,*) 'istate_eel : EEL R5: constant salinity field, S = ', zsal 319 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 320 ! 321 tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 322 tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 323 ! 324 ! ! =========================== 325 CASE DEFAULT ! NONE existing configuration 326 ! ! =========================== 327 WRITE(ctmp1,*) 'EEL with a ', jp_cfg,' km resolution is not coded' 328 CALL ctl_stop( ctmp1 ) 329 ! 330 END SELECT 331 ! 332 END SUBROUTINE istate_eel 333 334 335 SUBROUTINE istate_gyre 336 !!---------------------------------------------------------------------- 337 !! *** ROUTINE istate_gyre *** 338 !! 339 !! ** Purpose : Initialization of the dynamics and tracers for GYRE 340 !! configuration (double gyre with rotated domain) 341 !! 342 !! ** Method : - set temprature field 343 !! - set salinity field 344 !!---------------------------------------------------------------------- 345 INTEGER :: ji, jj, jk ! dummy loop indices 346 INTEGER :: inum ! temporary logical unit 347 INTEGER, PARAMETER :: ntsinit = 0 ! (0/1) (analytical/input data files) T&S initialization 348 !!---------------------------------------------------------------------- 349 ! 350 SELECT CASE ( ntsinit) 351 ! 352 CASE ( 0 ) ! analytical T/S profil deduced from LEVITUS 353 IF(lwp) WRITE(numout,*) 354 IF(lwp) WRITE(numout,*) 'istate_gyre : initial analytical T and S profil deduced from LEVITUS ' 355 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 356 ! 357 DO jk = 1, jpk 358 DO jj = 1, jpj 359 DO ji = 1, jpi 360 tsn(ji,jj,jk,jp_tem) = ( 16. - 12. * TANH( (gdept_n(ji,jj,jk) - 400) / 700 ) ) & 361 & * (-TANH( (500-gdept_n(ji,jj,jk)) / 150 ) + 1) / 2 & 362 & + ( 15. * ( 1. - TANH( (gdept_n(ji,jj,jk)-50.) / 1500.) ) & 363 & - 1.4 * TANH((gdept_n(ji,jj,jk)-100.) / 100.) & 364 & + 7. * (1500. - gdept_n(ji,jj,jk)) / 1500. ) & 365 & * (-TANH( (gdept_n(ji,jj,jk) - 500) / 150) + 1) / 2 366 tsn(ji,jj,jk,jp_tem) = tsn(ji,jj,jk,jp_tem) * tmask(ji,jj,jk) 367 tsb(ji,jj,jk,jp_tem) = tsn(ji,jj,jk,jp_tem) 368 369 tsn(ji,jj,jk,jp_sal) = ( 36.25 - 1.13 * TANH( (gdept_n(ji,jj,jk) - 305) / 460 ) ) & 370 & * (-TANH((500 - gdept_n(ji,jj,jk)) / 150) + 1) / 2 & 371 & + ( 35.55 + 1.25 * (5000. - gdept_n(ji,jj,jk)) / 5000. & 372 & - 1.62 * TANH( (gdept_n(ji,jj,jk) - 60. ) / 650. ) & 373 & + 0.2 * TANH( (gdept_n(ji,jj,jk) - 35. ) / 100. ) & 374 & + 0.2 * TANH( (gdept_n(ji,jj,jk) - 1000.) / 5000.) ) & 375 & * (-TANH((gdept_n(ji,jj,jk) - 500) / 150) + 1) / 2 376 tsn(ji,jj,jk,jp_sal) = tsn(ji,jj,jk,jp_sal) * tmask(ji,jj,jk) 377 tsb(ji,jj,jk,jp_sal) = tsn(ji,jj,jk,jp_sal) 378 END DO 379 END DO 380 END DO 381 ! 382 CASE ( 1 ) ! T/S data fields read in dta_tem.nc/data_sal.nc files 383 IF(lwp) WRITE(numout,*) 384 IF(lwp) WRITE(numout,*) 'istate_gyre : initial T and S read from dta_tem.nc/data_sal.nc files' 385 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 386 IF(lwp) WRITE(numout,*) ' NetCDF FORMAT' 387 388 ! Read temperature field 389 ! ---------------------- 390 CALL iom_open ( 'data_tem', inum ) 391 CALL iom_get ( inum, jpdom_data, 'votemper', tsn(:,:,:,jp_tem) ) 392 CALL iom_close( inum ) 393 394 tsn(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) * tmask(:,:,:) 395 tsb(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) 396 397 ! Read salinity field 398 ! ------------------- 399 CALL iom_open ( 'data_sal', inum ) 400 CALL iom_get ( inum, jpdom_data, 'vosaline', tsn(:,:,:,jp_sal) ) 401 CALL iom_close( inum ) 402 403 tsn(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) * tmask(:,:,:) 404 tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 405 ! 406 END SELECT 407 ! 408 IF(lwp) THEN 409 WRITE(numout,*) 410 WRITE(numout,*) ' Initial temperature and salinity profiles:' 411 WRITE(numout, "(9x,' level gdept_1d temperature salinity ')" ) 412 WRITE(numout, "(10x, i4, 3f10.2)" ) ( jk, gdept_1d(jk), tsn(2,2,jk,jp_tem), tsn(2,2,jk,jp_sal), jk = 1, jpk ) 413 ENDIF 414 ! 415 END SUBROUTINE istate_gyre 416 417 418 SUBROUTINE istate_uvg 419 !!---------------------------------------------------------------------- 420 !! *** ROUTINE istate_uvg *** 421 !! 422 !! ** Purpose : Compute the geostrophic velocities from (tn,sn) fields 423 !! 424 !! ** Method : Using the hydrostatic hypothesis the now hydrostatic 425 !! pressure is computed by integrating the in-situ density from the 426 !! surface to the bottom. 427 !! p=integral [ rau*g dz ] 428 !!---------------------------------------------------------------------- 429 USE divhor ! hor. divergence (div_hor routine) 430 USE lbclnk ! ocean lateral boundary condition (or mpp link) 431 ! 432 INTEGER :: ji, jj, jk ! dummy loop indices 433 REAL(wp) :: zmsv, zphv, zmsu, zphu, zalfg ! temporary scalars 434 REAL(wp), POINTER, DIMENSION(:,:,:) :: zprn 435 !!---------------------------------------------------------------------- 436 ! 437 CALL wrk_alloc( jpi,jpj,jpk, zprn) 438 ! 439 IF(lwp) WRITE(numout,*) 440 IF(lwp) WRITE(numout,*) 'istate_uvg : Start from Geostrophy' 441 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' 442 443 ! Compute the now hydrostatic pressure 444 ! ------------------------------------ 445 446 zalfg = 0.5 * grav * rau0 447 448 zprn(:,:,1) = zalfg * e3w_n(:,:,1) * ( 1 + rhd(:,:,1) ) ! Surface value 449 450 DO jk = 2, jpkm1 ! Vertical integration from the surface 451 zprn(:,:,jk) = zprn(:,:,jk-1) & 452 & + zalfg * e3w_n(:,:,jk) * ( 2. + rhd(:,:,jk) + rhd(:,:,jk-1) ) 453 END DO 454 455 ! Compute geostrophic balance 456 ! --------------------------- 457 DO jk = 1, jpkm1 458 DO jj = 2, jpjm1 459 DO ji = fs_2, fs_jpim1 ! vertor opt. 460 zmsv = 1. / MAX( umask(ji-1,jj+1,jk) + umask(ji ,jj+1,jk) & 461 + umask(ji-1,jj ,jk) + umask(ji ,jj ,jk) , 1. ) 462 zphv = ( zprn(ji ,jj+1,jk) - zprn(ji-1,jj+1,jk) ) * umask(ji-1,jj+1,jk) / e1u(ji-1,jj+1) & 463 + ( zprn(ji+1,jj+1,jk) - zprn(ji ,jj+1,jk) ) * umask(ji ,jj+1,jk) / e1u(ji ,jj+1) & 464 + ( zprn(ji ,jj ,jk) - zprn(ji-1,jj ,jk) ) * umask(ji-1,jj ,jk) / e1u(ji-1,jj ) & 465 + ( zprn(ji+1,jj ,jk) - zprn(ji ,jj ,jk) ) * umask(ji ,jj ,jk) / e1u(ji ,jj ) 466 zphv = 1. / rau0 * zphv * zmsv * vmask(ji,jj,jk) 467 468 zmsu = 1. / MAX( vmask(ji+1,jj ,jk) + vmask(ji ,jj ,jk) & 469 + vmask(ji+1,jj-1,jk) + vmask(ji ,jj-1,jk) , 1. ) 470 zphu = ( zprn(ji+1,jj+1,jk) - zprn(ji+1,jj ,jk) ) * vmask(ji+1,jj ,jk) / e2v(ji+1,jj ) & 471 + ( zprn(ji ,jj+1,jk) - zprn(ji ,jj ,jk) ) * vmask(ji ,jj ,jk) / e2v(ji ,jj ) & 472 + ( zprn(ji+1,jj ,jk) - zprn(ji+1,jj-1,jk) ) * vmask(ji+1,jj-1,jk) / e2v(ji+1,jj-1) & 473 + ( zprn(ji ,jj ,jk) - zprn(ji ,jj-1,jk) ) * vmask(ji ,jj-1,jk) / e2v(ji ,jj-1) 474 zphu = 1. / rau0 * zphu * zmsu * umask(ji,jj,jk) 475 476 ! Compute the geostrophic velocities 477 un(ji,jj,jk) = -2. * zphu / ( ff(ji,jj) + ff(ji ,jj-1) ) 478 vn(ji,jj,jk) = 2. * zphv / ( ff(ji,jj) + ff(ji-1,jj ) ) 479 END DO 480 END DO 481 END DO 482 483 IF(lwp) WRITE(numout,*) ' we force to zero bottom velocity' 484 485 ! Susbtract the bottom velocity (level jpk-1 for flat bottom case) 486 ! to have a zero bottom velocity 487 488 DO jk = 1, jpkm1 489 un(:,:,jk) = ( un(:,:,jk) - un(:,:,jpkm1) ) * umask(:,:,jk) 490 vn(:,:,jk) = ( vn(:,:,jk) - vn(:,:,jpkm1) ) * vmask(:,:,jk) 491 END DO 492 493 CALL lbc_lnk( un, 'U', -1. ) 494 CALL lbc_lnk( vn, 'V', -1. ) 495 496 ub(:,:,:) = un(:,:,:) 497 vb(:,:,:) = vn(:,:,:) 498 499 ! 500 !!gm Check here call to div_hor should not be necessary 501 !!gm div_hor call runoffs not sure they are defined at that level 502 CALL div_hor( nit000 ) ! now horizontal divergence 503 ! 504 CALL wrk_dealloc( jpi,jpj,jpk, zprn) 505 ! 506 END SUBROUTINE istate_uvg 507 508 !!===================================================================== 170 !!====================================================================== 509 171 END MODULE istate -
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/DOM/phycst.F90
r5147 r7421 100 100 !! *** ROUTINE phy_cst *** 101 101 !! 102 !! ** Purpose : Print model parameters and set and print the constants 103 !!---------------------------------------------------------------------- 104 CHARACTER (len=64) :: cform = "(A12, 3(A13, I7) )" 102 !! ** Purpose : set and print the constants 105 103 !!---------------------------------------------------------------------- 106 104 107 105 IF(lwp) WRITE(numout,*) 108 IF(lwp) WRITE(numout,*) ' 109 IF(lwp) WRITE(numout,*) ' 106 IF(lwp) WRITE(numout,*) 'phy_cst : initialization of ocean parameters and constants' 107 IF(lwp) WRITE(numout,*) '~~~~~~~' 110 108 111 ! Ocean Parameters 112 ! ---------------- 113 IF(lwp) THEN 114 WRITE(numout,*) ' Domain info' 115 WRITE(numout,*) ' dimension of model' 116 WRITE(numout,*) ' Local domain Global domain Data domain ' 117 WRITE(numout,cform) ' ',' jpi : ', jpi, ' jpiglo : ', jpiglo, ' jpidta : ', jpidta 118 WRITE(numout,cform) ' ',' jpj : ', jpj, ' jpjglo : ', jpjglo, ' jpjdta : ', jpjdta 119 WRITE(numout,cform) ' ',' jpk : ', jpk, ' jpk : ', jpk , ' jpkdta : ', jpkdta 120 WRITE(numout,*) ' ',' jpij : ', jpij 121 WRITE(numout,*) ' mpp local domain info (mpp)' 122 WRITE(numout,*) ' jpni : ', jpni, ' jpreci : ', jpreci 123 WRITE(numout,*) ' jpnj : ', jpnj, ' jprecj : ', jprecj 124 WRITE(numout,*) ' jpnij : ', jpnij 125 WRITE(numout,*) ' lateral domain boundary condition type : jperio = ', jperio 126 ENDIF 127 128 ! Define constants 129 ! ---------------- 109 ! Define & print constants 110 ! ------------------------ 130 111 IF(lwp) WRITE(numout,*) 131 112 IF(lwp) WRITE(numout,*) ' Constants'
Note: See TracChangeset
for help on using the changeset viewer.