Changeset 11604
- Timestamp:
- 2019-09-26T18:48:45+02:00 (5 years ago)
- Location:
- NEMO/branches/2019/ENHANCE-03_domcfg/src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/ENHANCE-03_domcfg/src/dom_oce.F90
r11602 r11604 239 239 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: wmask !: land/ocean mask at W- pts 240 240 241 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: msk_opnsea, msk_closea !: open ocean mask, closed sea mask (all of them)242 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: msk_glo , msk_rnf , msk_emp !: closed sea masks243 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: msk_gloid, msk_rnfid, msk_empid !: closed sea masks241 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: msk_opnsea, msk_closea !: open ocean mask, closed sea mask (all of them) 242 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: msk_glo , msk_rnf , msk_emp !: closed sea masks 243 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: msk_gloid, msk_rnfid, msk_empid !: closed sea masks 244 244 245 245 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: tpol, fpol !: north fold mask (jperio= 3 or 4) -
NEMO/branches/2019/ENHANCE-03_domcfg/src/domain.F90
r11201 r11604 61 61 !! - 1D configuration, move Coriolis, u and v at T-point 62 62 !!---------------------------------------------------------------------- 63 INTEGER :: jk ! dummy loop indices64 INTEGER :: iconf = 0 ! local integers65 REAL(wp), POINTER, DIMENSION(:,:) :: z1_hu_0, z1_hv_066 !!----------------------------------------------------------------------67 63 ! 68 64 IF(lwp) THEN … … 80 76 CALL dom_zgr ! Vertical mesh and bathymetry 81 77 ! 82 IF ( ln_domclo .OR. n msh > 0 ) CALL dom_msk ! compute mask (needed by dom_clo78 IF ( ln_domclo .OR. nn_msh > 0 ) CALL dom_msk ! compute mask (needed by dom_clo) 83 79 ! 84 80 IF ( ln_domclo ) CALL dom_clo ! Closed seas and lake … … 420 416 IF (ln_domclo) THEN 421 417 ! mask for the open sea 422 CALL iom_rstput( 0, 0, inum, 'mask_opensea' , msk_opnsea, ktype = jp_i4 )418 CALL iom_rstput( 0, 0, inum, 'mask_opensea' , msk_opnsea, ktype = jp_i4 ) 423 419 ! mask for all the under closed sea 424 CALL iom_rstput( 0, 0, inum, 'mask_csundef' , msk_closea, ktype = jp_i4 )420 CALL iom_rstput( 0, 0, inum, 'mask_csundef' , msk_closea, ktype = jp_i4 ) 425 421 ! mask for global, local net precip, local net precip and evaporation correction 426 CALL iom_rstput( 0, 0, inum, 'mask_csglo' , msk_glo, ktype = jp_i4 )427 CALL iom_rstput( 0, 0, inum, 'mask_csemp' , msk_emp, ktype = jp_i4 )428 CALL iom_rstput( 0, 0, inum, 'mask_csrnf' , msk_rnf, ktype = jp_i4 )422 CALL iom_rstput( 0, 0, inum, 'mask_csglo' , msk_glo , ktype = jp_i4 ) 423 CALL iom_rstput( 0, 0, inum, 'mask_csemp' , msk_emp , ktype = jp_i4 ) 424 CALL iom_rstput( 0, 0, inum, 'mask_csrnf' , msk_rnf , ktype = jp_i4 ) 429 425 ! mask for the various river mouth (in case multiple lake in the same outlet) 430 CALL iom_rstput( 0, 0, inum, 'mask_csgrpglo', msk_gloid , ktype = jp_i4 )431 CALL iom_rstput( 0, 0, inum, 'mask_csgrpemp', msk_empid , ktype = jp_i4 )432 CALL iom_rstput( 0, 0, inum, 'mask_csgrprnf', msk_rnfid , ktype = jp_i4 )426 CALL iom_rstput( 0, 0, inum, 'mask_csgrpglo', msk_gloid , ktype = jp_i4 ) 427 CALL iom_rstput( 0, 0, inum, 'mask_csgrpemp', msk_empid , ktype = jp_i4 ) 428 CALL iom_rstput( 0, 0, inum, 'mask_csgrprnf', msk_rnfid , ktype = jp_i4 ) 433 429 END IF 434 430 ! -
NEMO/branches/2019/ENHANCE-03_domcfg/src/domclo.F90
r11201 r11604 58 58 CHARACTER(256) :: cloctrg ! where water is spread 59 59 CHARACTER(256) :: cschtrg ! how water is spread 60 REAL(wp) :: radtrg ! radius of closed sea river mouth 60 REAL(wp) :: radtrg ! radius of closed sea river mouth (used if cschtrg is rnf or emp) 61 61 INTEGER :: idtrg ! target id in case multiple lakes for the same river mouth 62 62 END TYPE … … 70 70 INTEGER :: nn_closea ! number of closed seas 71 71 72 REAL(wp) :: zdistseed ! distance to seed 73 REAL(wp) :: zarea ! river mouth area 74 REAL(wp) :: rn_lon_opnsea, rn_lat_opnsea ! open sea seed 75 REAL(wp), DIMENSION(1) :: zchk, zradtrg 76 REAL(wp), DIMENSION(jpi,jpj) :: zmsksrc, zmsktrg, zmsk_coastline, zdist 77 78 CHARACTER(256) :: csch, cloc ! scheme name for water spreading (glo, rnf, emp) 79 TYPE(closea) , DIMENSION(jp_closea) :: sn_lake ! lake properties 72 REAL(wp) :: zdistseed ! distance to seed 73 REAL(wp) :: zarea ! river mouth area 74 REAL(wp) :: rn_lon_opnsea, rn_lat_opnsea ! open sea seed 75 REAL(wp), DIMENSION(1) :: zchk, zradtrg ! 76 REAL(wp), DIMENSION(jpi,jpj) :: zdist ! distance to seed trg location 77 REAL(wp), DIMENSION(jpi,jpj) :: zmsksrc, zmsktrg, zmsk_coastline ! various mask 78 79 CHARACTER(256) :: csch, cloc ! scheme name for water spreading (glo, rnf, emp) 80 TYPE(closea) , DIMENSION(jp_closea) :: sn_lake ! lake properties 80 81 81 82 LOGICAL :: lskip ! flag in case lake seed on land or already filled (...) … … 90 91 NAMELIST/namclo/ rn_lon_opnsea, rn_lat_opnsea, nn_closea, sn_lake 91 92 !!--------------------------------------------------------------------- 92 PRINT *, rn_lon_opnsea, rn_lat_opnsea, nn_closea 93 !! 93 94 94 REWIND( numnam_ref ) ! Namelist namlbc in reference namelist : Lateral momentum boundary condition 95 95 READ ( numnam_ref, namclo, IOSTAT = ios, ERR = 901 ) … … 118 118 IF (zchk(1) == 0._wp) CALL ctl_stop( 'STOP', 'open sea seed is on land, please update namelist (rn_lon_opnsea,rn_lat_opnsea)' ) 119 119 120 !! 1.3 set to 0 everything >0 and revert mask120 !! print 121 121 IF (lwp) THEN 122 122 WRITE(numout,*) … … 128 128 END IF 129 129 130 WHERE (msk_opnsea(:,:) > 0) msk_opnsea(:,:) = 0 ! mask all closed seas 131 WHERE (msk_opnsea(:,:) < 0) msk_opnsea(:,:) = 1 ! restore mask value 130 !! 1.3 set to 0 everything >0 and revert mask 131 WHERE (msk_opnsea(:,:) > 0._wp) msk_opnsea(:,:) = 0._wp ! mask all closed seas 132 WHERE (msk_opnsea(:,:) < 0._wp) msk_opnsea(:,:) = 1._wp ! restore mask value 132 133 133 134 !! 1.4 Define closed sea mask (all of them, ie defined in the namelist or not) 134 135 !! needed to remove the undefined closed seas at the end 135 msk_closea = (ssmask - msk_opnsea) * 99136 msk_closea(:,:) = ( ssmask(:,:) - msk_opnsea(:,:) ) * 99._wp 136 137 137 138 !!---------------------------------------------------------------------- … … 142 143 jglo = 1 ; jrnf = 1 ; jemp = 1 143 144 !! mask used to group lake by net evap/precip distribution technics 144 msk_glo = msk_closea145 msk_rnf = msk_closea146 msk_emp = msk_closea145 msk_glo(:,:) = msk_closea(:,:) 146 msk_rnf(:,:) = msk_closea(:,:) 147 msk_emp(:,:) = msk_closea(:,:) 147 148 148 149 !! mask used to group multiple lake with the same river mouth (great lake for example) 149 msk_gloid = 0.0_wp150 msk_rnfid = 0.0_wp151 msk_empid = 0.0_wp150 msk_gloid(:,:) = 0.0_wp 151 msk_rnfid(:,:) = 0.0_wp 152 msk_empid(:,:) = 0.0_wp 152 153 153 154 IF (lwp) WRITE(numout,*)'closed seas: ' … … 175 176 CASE('glo') 176 177 jsch = jglo 177 zmsksrc = msk_glo178 zmsktrg = msk_gloid178 zmsksrc(:,:) = msk_glo(:,:) 179 zmsktrg(:,:) = msk_gloid(:,:) 179 180 IF (lwp) WRITE(numout,*)' net evap/precip will be spread globally' 180 181 CASE('rnf') 181 182 jsch = jrnf 182 zmsksrc = msk_rnf183 zmsktrg = msk_rnfid183 zmsksrc(:,:) = msk_rnf(:,:) 184 zmsktrg(:,:) = msk_rnfid(:,:) 184 185 IF (lwp) WRITE(numout,*)' net precip will be spread locally and net evap globally' 185 186 CASE('emp') 186 187 jsch = jemp 187 zmsksrc = msk_emp188 zmsktrg = msk_empid188 zmsksrc(:,:) = msk_emp(:,:) 189 zmsktrg(:,:) = msk_empid(:,:) 189 190 IF (lwp) WRITE(numout,*)' net precip will be spread locally' 190 191 CASE DEFAULT … … 213 214 !! fill close sea mask with counter value 214 215 CALL fill_pool( jiseed, jjseed, zmsksrc, REAL(jsch ,8)) 215 WHERE (zmsksrc == REAL(jsch,8))216 WHERE (zmsksrc(:,:) == REAL(jsch,8)) 216 217 msk_closea = 0._wp 217 218 zmsktrg = sn_lake(jcs)%idtrg … … 220 221 !! compute location of river mouth and distance to river mouth 221 222 IF (cloc /= 'global') THEN 223 222 224 !! set a minimum value for radius of the river influence 223 225 zradtrg = 0._wp … … 229 231 !! compute seed location for print 230 232 CALL dom_ngb(sn_lake(jcs)%rlontrg, sn_lake(jcs)%rlattrg, jiseed, jjseed, zdistseed, 'T') 233 231 234 !! compute distance to river mouth 232 235 zdist(:,:) = dist(sn_lake(jcs)%rlontrg, sn_lake(jcs)%rlattrg, glamt, gphit) 236 233 237 END IF 234 238 … … 237 241 SELECT CASE (cloc) 238 242 CASE ('global') 239 WHERE (msk_opnsea(:,:) == 1 ) zmsktrg = sn_lake(jcs)%idtrg243 WHERE (msk_opnsea(:,:) == 1._wp) zmsktrg = sn_lake(jcs)%idtrg 240 244 241 245 CASE ('local') 242 246 !! compute mask 243 247 WHERE (zdist(:,:) < zradtrg(1) .AND. msk_opnsea(:,:) == 1 ) zmsktrg = sn_lake(jcs)%idtrg 248 244 249 !! print 245 250 IF (lwp) WRITE(numout,'(a,f7.0,a,2f7.2,a,2i7,a)')' river mouth area is defined by points within ',zradtrg(1) & 246 251 & ,' m of lat/lon ', sn_lake(jcs)%rlontrg, sn_lake(jcs)%rlattrg & 247 252 & ,' (closest point is i/j ',jiseed, jjseed,')' 248 249 253 CASE ('coast') 250 254 !! define coastline mask … … 259 263 !! compute mask 260 264 WHERE ( zdist(:,:) < zradtrg(1) .AND. zmsk_coastline(:,:) == 1 .AND. msk_opnsea(:,:) == 1 ) zmsktrg = sn_lake(jcs)%idtrg 265 261 266 !! print 262 267 IF (lwp) WRITE(numout,'(a,f7.0,a,2f7.2,a,2i7,a)')' river mouth area is defined by coastal points within ',zradtrg(1) & … … 277 282 CASE ('glo') 278 283 jglo = jglo + 1 279 msk_glo = zmsksrc280 msk_gloid = zmsktrg284 msk_glo(:,:) = zmsksrc(:,:) 285 msk_gloid(:,:) = zmsktrg(:,:) 281 286 CASE ('rnf') 282 287 jrnf = jrnf + 1 283 msk_rnf = zmsksrc284 msk_rnfid = zmsktrg288 msk_rnf(:,:) = zmsksrc(:,:) 289 msk_rnfid(:,:) = zmsktrg(:,:) 285 290 CASE ('emp') 286 291 jemp = jemp + 1 287 msk_emp = zmsksrc288 msk_empid = zmsktrg292 msk_emp(:,:) = zmsksrc(:,:) 293 msk_empid(:,:) = zmsktrg(:,:) 289 294 END SELECT 290 295 … … 298 303 299 304 !! mask all the cells not defined as closed sea 300 WHERE ( msk_glo == 99 ) msk_glo = 0301 WHERE ( msk_rnf == 99 ) msk_rnf = 0302 WHERE ( msk_emp == 99 ) msk_emp = 0305 WHERE ( msk_glo(:,:) == 99._wp ) msk_glo = 0._wp 306 WHERE ( msk_rnf(:,:) == 99._wp ) msk_rnf = 0._wp 307 WHERE ( msk_emp(:,:) == 99._wp ) msk_emp = 0._wp 303 308 304 309 !! non defined closed sea 305 WHERE ( msk_closea > 0) msk_closea = 1310 WHERE ( msk_closea(:,:) > 0._wp ) msk_closea = 1._wp 306 311 307 312 END SUBROUTINE dom_clo -
NEMO/branches/2019/ENHANCE-03_domcfg/src/domutl.F90
r11201 r11604 45 45 !! 46 46 !!---------------------------------------------------------------------- 47 INTEGER, INTENT(in) :: kiseed, kjseed, kkseed 48 REAL(wp), INTENT(in) :: rfill ! filling value 49 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: rdta ! input data 50 REAL(wp), DIMENSION(jpi,jpj,jpk) :: rseedmap, rseedmap_b ! 51 52 INTEGER :: ip=0 ! size of the pile 47 INTEGER, INTENT(in) :: kiseed, kjseed, kkseed ! seed 48 REAL(wp), INTENT(in) :: rfill ! filling value 49 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: rdta ! input data 50 REAL(wp), DIMENSION(jpi,jpj,jpk) :: rseedmap, rseedmap_b ! map of seed (use for processor communication) 51 53 52 INTEGER :: ii , ij , ik , kii, kjj, jj, kk ! working integer 54 INTEGER :: iip1, ijp1, ikp1 55 INTEGER :: iim1, ijm1, ikm1 56 INTEGER :: nseed 53 INTEGER :: iip1, ijp1, ikp1 ! working integer 54 INTEGER :: iim1, ijm1, ikm1 ! working integer 55 INTEGER :: nseed ! size of the stack 57 56 TYPE (idx), POINTER :: seed 58 57 !!---------------------------------------------------------------------- … … 75 74 nseed=SUM(rseedmap); IF( lk_mpp ) CALL mpp_sum('domutil', nseed ) ! nseed =0 means on land => WARNING later on 76 75 ! 77 ! loop until the pilesize is 0 or if the pool is larger than the critical size76 ! loop until the stack size is 0 or if the pool is larger than the critical size 78 77 IF (nseed > 0) THEN 79 78 ! seed on ocean continue 80 79 DO WHILE ( nseed /= 0 ) 81 80 DO WHILE ( ASSOCIATED(seed) ) 82 ip=ip+183 81 ii=seed%i; ij=seed%j ; ik=seed%k ; rseedmap(ii,ij,ik)=1. 84 82 ! 85 ! update bathy and update pilesize83 ! update bathy and update stack size 86 84 CALL del_head_idx(seed) 87 85 ! … … 143 141 !! 144 142 !!---------------------------------------------------------------------- 145 INTEGER, INTENT(in) :: kiseed, kjseed 146 REAL(wp), INTENT(in) :: rfill ! filling value 147 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: rdta ! input data 148 REAL(wp), DIMENSION(jpi,jpj) :: rseedmap, rseedmap_b 149 150 INTEGER :: ip=0 ! size of the pile 143 INTEGER, INTENT(in) :: kiseed, kjseed ! seed 144 REAL(wp), INTENT(in) :: rfill ! filling value 145 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: rdta ! input data 146 REAL(wp), DIMENSION(jpi,jpj) :: rseedmap, rseedmap_b ! location of new seed (used for processor exchange) 147 151 148 INTEGER :: ii , ij , jj, kii, kjj ! working integer 152 INTEGER :: iip1, ijp1 ! working integer153 INTEGER :: iim1, ijm1 154 INTEGER :: nseed 149 INTEGER :: iip1, ijp1 ! working integer 150 INTEGER :: iim1, ijm1 ! working integer 151 INTEGER :: nseed ! size of the stack 155 152 TYPE (idx), POINTER :: seed 156 153 !!---------------------------------------------------------------------- … … 173 170 nseed=SUM(rseedmap); IF( lk_mpp ) CALL mpp_sum('domutil', nseed ) ! nseed =0 means on land => WARNING later on 174 171 ! 175 ! loop until the pilesize is 0 or if the pool is larger than the critical size172 ! loop until the stack size is 0 or if the pool is larger than the critical size 176 173 IF (nseed > 0) THEN 177 174 ! seed on ocean continue 178 175 DO WHILE ( nseed .NE. 0 ) 179 176 DO WHILE ( ASSOCIATED(seed) ) 180 ip=ip+1181 177 ii=seed%i; ij=seed%j ; rseedmap(ii,ij)=1. 182 ! update pilesize178 ! update stack size 183 179 CALL del_head_idx(seed) 184 180 ! … … 226 222 ! subroutine to deals with link list 227 223 ! 228 SUBROUTINE create_idx(pt_idx, ki, kj, kk)229 TYPE (idx), POINTER :: pt_idx230 INTEGER, INTENT(in) :: ki, kj, kk231 !232 ! initialised all field to NULL()233 NULLIFY(pt_idx)234 !235 ! allocate new element236 ALLOCATE(pt_idx)237 pt_idx%i=ki ; pt_idx%j=kj ; pt_idx%k=kk ;238 pt_idx%next => NULL()239 END SUBROUTINE create_idx240 241 224 SUBROUTINE add_head_idx(pt_idx, ki, kj, kk) 225 !!--------------------------------------------------------------------- 226 !! *** ROUTINE add_head_idx *** 227 !! 228 !! ** Purpose : add one element in the linked list 229 !! 230 !! ** Method : allocate one element, then point %next to the linked list 231 !!---------------------------------------------------------------------- 242 232 TYPE (idx), POINTER :: pt_idx 243 233 TYPE (idx), POINTER :: zpt_new … … 255 245 256 246 SUBROUTINE del_head_idx(pt_idx) 247 !!--------------------------------------------------------------------- 248 !! *** ROUTINE del_head_idx *** 249 !! 250 !! ** Purpose : delete one element in the linked list 251 !! 252 !! ** Method : move the pointer to the next node 253 !!---------------------------------------------------------------------- 257 254 TYPE (idx), POINTER :: pt_idx 258 255 TYPE (idx), POINTER :: zpt_tmp
Note: See TracChangeset
for help on using the changeset viewer.