80
81
82
83
84 integer, intent(in) :: ng, tile, model
85 integer, intent(in) :: LBi, UBi, LBj, UBj
86 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
87 integer, intent(in) :: linew, liold, liunw
88
89
90
91
92 integer :: i, j
93
94#include "set_bounds.h"
95
96
97
98
99
100 CALL ice_mpdata_tile (ng, tile, model, &
101 & lbi, ubi, lbj, ubj, &
102 & imins, imaxs, jmins, jmaxs, &
103 & linew, liold, liunw, &
104#ifdef MASKING
105 & grid(ng) % rmask, &
106 & grid(ng) % umask, &
107 & grid(ng) % vmask, &
108#endif
109#ifdef WET_DRY
110 & grid(ng) % rmask_wet, &
111 & grid(ng) % umask_wet, &
112 & grid(ng) % vmask_wet, &
113#endif
114#ifdef ICESHELF
115 & grid(ng) % zice, &
116#endif
117#ifndef ICE_UPWIND
118 & grid(ng) % pm, &
119 & grid(ng) % pn, &
120#endif
121 & grid(ng) % on_u, &
122 & grid(ng) % om_v, &
123 & grid(ng) % omn, &
124 & ice(ng) % Si(:,:,:,isuice), &
125 & ice(ng) % Si(:,:,:,isvice), &
126 & ice(ng) % Si(:,:,:,isaice))
127
128 CALL ice_bc2d_tile (ng, tile, model, isaice, &
129 & lbi, ubi, lbj, ubj, &
130 & imins, imaxs, jmins, jmaxs, &
131 & liold, linew, &
132 & ice(ng) % Si(:,:,:,isuice), &
133 & ice(ng) % Si(:,:,:,isvice), &
134 & ice(ng) % Si(:,:,:,isaice), &
135 & lbc(:,ibice(isaice),ng))
136
137
138
139
140
141 CALL ice_mpdata_tile (ng, tile, model, &
142 & lbi, ubi, lbj, ubj, &
143 & imins, imaxs, jmins, jmaxs, &
144 & linew, liold, liunw, &
145#ifdef MASKING
146 & grid(ng) % rmask, &
147 & grid(ng) % umask, &
148 & grid(ng) % vmask, &
149#endif
150#ifdef WET_DRY
151 & grid(ng) % rmask_wet, &
152 & grid(ng) % umask_wet, &
153 & grid(ng) % vmask_wet, &
154#endif
155#ifdef ICESHELF
156 & grid(ng) % zice, &
157#endif
158#ifndef ICE_UPWIND
159 & grid(ng) % pm, &
160 & grid(ng) % pn, &
161#endif
162 & grid(ng) % on_u, &
163 & grid(ng) % om_v, &
164 & grid(ng) % omn, &
165 & ice(ng) % Si(:,:,:,isuice), &
166 & ice(ng) % Si(:,:,:,isvice), &
167 & ice(ng) % Si(:,:,:,ishice))
168
169 CALL ice_bc2d_tile (ng, tile, model, ishice, &
170 & lbi, ubi, lbj, ubj, &
171 & imins, imaxs, jmins, jmaxs, &
172 & liold, linew, &
173 & ice(ng) % Si(:,:,:,isuice), &
174 & ice(ng) % Si(:,:,:,isvice), &
175 & ice(ng) % Si(:,:,:,ishice), &
176 & lbc(:,ibice(ishice),ng))
177
178
179
180 DO j=jstrt,jendt
181 DO i=istrt,iendt
182 ice(ng)%Fi(i,j,icwdiv)=(ice(ng)%Si(i,j,linew,ishice)- &
183 & ice(ng)%Si(i,j,liold,ishice))/dt(ng)
184 END DO
185 END DO
186
187#ifdef ICE_THERMO
188
189
190
191
192
193 CALL ice_mpdata_tile (ng, tile, model, &
194 & lbi, ubi, lbj, ubj, &
195 & imins, imaxs, jmins, jmaxs, &
196 & linew, liold, liunw, &
197# ifdef MASKING
198 & grid(ng) % rmask, &
199 & grid(ng) % umask, &
200 & grid(ng) % vmask, &
201# endif
202# ifdef WET_DRY
203 & grid(ng) % rmask_wet, &
204 & grid(ng) % umask_wet, &
205 & grid(ng) % vmask_wet, &
206# endif
207# ifdef ICESHELF
208 & grid(ng) % zice, &
209# endif
210# ifndef ICE_UPWIND
211 & grid(ng) % pm, &
212 & grid(ng) % pn, &
213# endif
214 & grid(ng) % on_u, &
215 & grid(ng) % om_v, &
216 & grid(ng) % omn, &
217 & ice(ng) % Si(:,:,:,isuice), &
218 & ice(ng) % Si(:,:,:,isvice), &
219 & ice(ng) % Si(:,:,:,ishsno))
220
221 CALL ice_bc2d_tile (ng, tile, model, ishsno, &
222 & lbi, ubi, lbj, ubj, &
223 & imins, imaxs, jmins, jmaxs, &
224 & liold, linew, &
225 & ice(ng) % Si(:,:,:,isuice), &
226 & ice(ng) % Si(:,:,:,isvice), &
227 & ice(ng) % Si(:,:,:,ishsno), &
228 & lbc(:,ibice(ishsno),ng))
229
230
231
232
233
234 CALL ice_mpdata_tile (ng, tile, model, &
235 & lbi, ubi, lbj, ubj, &
236 & imins, imaxs, jmins, jmaxs, &
237 & linew, liold, liunw, &
238# ifdef MASKING
239 & grid(ng) % rmask, &
240 & grid(ng) % umask, &
241 & grid(ng) % vmask, &
242# endif
243# ifdef WET_DRY
244 & grid(ng) % rmask_wet, &
245 & grid(ng) % umask_wet, &
246 & grid(ng) % vmask_wet, &
247# endif
248# ifdef ICESHELF
249 & grid(ng) % zice, &
250# endif
251# ifndef ICE_UPWIND
252 & grid(ng) % pm, &
253 & grid(ng) % pn, &
254# endif
255 & grid(ng) % on_u, &
256 & grid(ng) % om_v, &
257 & grid(ng) % omn, &
258 & ice(ng) % Si(:,:,:,isuice), &
259 & ice(ng) % Si(:,:,:,isvice), &
260 & ice(ng) % Si(:,:,:,ishmel))
261
262 CALL ice_bc2d_tile (ng, tile, model, ishmel, &
263 & lbi, ubi, lbj, ubj, &
264 & imins, imaxs, jmins, jmaxs, &
265 & liold, linew, &
266 & ice(ng) % Si(:,:,:,isuice), &
267 & ice(ng) % Si(:,:,:,isvice), &
268 & ice(ng) % Si(:,:,:,ishmel), &
269 & lbc(:,ibice(ishmel),ng))
270
271
272
273
274
275 CALL ice_mpdata_tile (ng, tile, model, &
276 & lbi, ubi, lbj, ubj, &
277 & imins, imaxs, jmins, jmaxs, &
278 & linew, liold, liunw, &
279# ifdef MASKING
280 & grid(ng) % rmask, &
281 & grid(ng) % umask, &
282 & grid(ng) % vmask, &
283# endif
284# ifdef WET_DRY
285 & grid(ng) % rmask_wet, &
286 & grid(ng) % umask_wet, &
287 & grid(ng) % vmask_wet, &
288# endif
289# ifdef ICESHELF
290 & grid(ng) % zice, &
291# endif
292# ifndef ICE_UPWIND
293 & grid(ng) % pm, &
294 & grid(ng) % pn, &
295# endif
296 & grid(ng) % on_u, &
297 & grid(ng) % om_v, &
298 & grid(ng) % omn, &
299 & ice(ng) % Si(:,:,:,isuice), &
300 & ice(ng) % Si(:,:,:,isvice), &
301 & ice(ng) % Si(:,:,:,isenth))
302
303 DO j=jstrt,jendt
304 DO i=istrt,iendt
305 ice(ng)%Si(i,j,linew,istice)=ice(ng)%Si(i,j,linew,isenth)/ &
306 & max(ice(ng)%Si(i,j,linew,ishice),&
307 & 1.0e-6_r8)
308 IF (ice(ng)%Si(i,j,linew,ishice).le.min_hi(ng)) THEN
309 ice(ng)%Si(i,j,linew,isenth)=0.0_r8
310 ice(ng)%Si(i,j,linew,istice)=0.0_r8
311 END IF
312 END DO
313 END DO
314
315 CALL ice_tibc_tile (ng, tile, model, &
316 & lbi, ubi, lbj, ubj, &
317 & liold, linew, &
318 & ice(ng) % Si(:,:,:,isuice), &
319 & ice(ng) % Si(:,:,:,isvice), &
320 & ice(ng) % Si(:,:,:,ishice), &
321 & ice(ng) % Si(:,:,:,istice), &
322 & ice(ng) % Si(:,:,:,isenth))
323
324
325
326
327
328
329 DO j=jstrt,jendt
330 DO i=istrt,iendt
331 ice(ng)%Si(i,j,liold,ishage)=ice(ng)%Si(i,j,liold,ishice)* &
332 & ice(ng)%Si(i,j,liold,isiage)
333 ice(ng)%Si(i,j,linew,ishage)=ice(ng)%Si(i,j,linew,ishice)* &
334 & ice(ng)%Si(i,j,linew,isiage)
335 IF (ice(ng)%Si(i,j,liold,ishice).le.min_hi(ng)) THEN
336 ice(ng)%Si(i,j,liold,ishage)=0.0_r8
337 ice(ng)%Si(i,j,liold,isiage)=0.0_r8
338 END IF
339 END DO
340 END DO
341
342 CALL ice_mpdata_tile (ng, tile, model, &
343 & lbi, ubi, lbj, ubj, &
344 & imins, imaxs, jmins, jmaxs, &
345 & linew, liold, liunw, &
346# ifdef MASKING
347 & grid(ng) % rmask, &
348 & grid(ng) % umask, &
349 & grid(ng) % vmask, &
350# endif
351# ifdef WET_DRY
352 & grid(ng) % rmask_wet, &
353 & grid(ng) % umask_wet, &
354 & grid(ng) % vmask_wet, &
355# endif
356# ifdef ICESHELF
357 & grid(ng) % zice, &
358# endif
359# ifndef ICE_UPWIND
360 & grid(ng) % pm, &
361 & grid(ng) % pn, &
362# endif
363 & grid(ng) % on_u, &
364 & grid(ng) % om_v, &
365 & grid(ng) % omn, &
366 & ice(ng) % Si(:,:,:,isuice), &
367 & ice(ng) % Si(:,:,:,isvice), &
368 & ice(ng) % Si(:,:,:,ishage))
369
370 DO j=jstrt,jendt
371 DO i=istrt,iendt
372 ice(ng)%Si(i,j,linew,isiage)=ice(ng)%Si(i,j,linew,ishage)/ &
373 & max(ice(ng)%Si(i,j,linew,ishice),&
374 & 1.0e-6_r8)
375 IF (ice(ng)%Si(i,j,linew,ishice).le.min_hi(ng)) THEN
376 ice(ng)%Si(i,j,linew,ishage)=0.0_r8
377 ice(ng)%Si(i,j,linew,isiage)=0.0_r8
378 END IF
379 END DO
380 END DO
381
382 CALL ice_bc2d_tile (ng, tile, model, isiage, &
383 & lbi, ubi, lbj, ubj, &
384 & imins, imaxs, jmins, jmaxs, &
385 & liold, linew, &
386 & ice(ng) % Si(:,:,:,isuice), &
387 & ice(ng) % Si(:,:,:,isvice), &
388 & ice(ng) % Si(:,:,:,isiage), &
389 & lbc(:,ibice(isiage),ng))
390#endif
391
392#if defined ICE_THERMO && defined ICE_BIO
393
394
395
396
397
398 CALL ice_mpdata_tile (ng, tile, model, &
399 & lbi, ubi, lbj, ubj, &
400 & imins, imaxs, jmins, jmaxs, &
401 & linew, liold, liunw, &
402# ifdef MASKING
403 & grid(ng) % rmask, &
404 & grid(ng) % rmask, &
405 & grid(ng) % vmask, &
406# endif
407# ifdef WET_DRY
408 & grid(ng) % rmask_wet, &
409 & grid(ng) % umask_wet, &
410 & grid(ng) % vmask_wet, &
411# endif
412# ifdef ICESHELF
413 & grid(ng) % zice, &
414# endif
415# ifndef ICE_UPWIND
416 & grid(ng) % pm, &
417 & grid(ng) % pn, &
418# endif
419 & grid(ng) % on_u, &
420 & grid(ng) % om_v, &
421 & grid(ng) % omn, &
422 & ice(ng) % Si(:,:,:,isuice), &
423 & ice(ng) % Si(:,:,:,isvice), &
424 & ice(ng) % Si(:,:,:,isiphy))
425
426
427
428 CALL ice_bc2d_tile (ng, tile, model, isiphy, &
429 & lbi, ubi, lbj, ubj, &
430 & liold, linew, &
431 & ice(ng) % Si(:,:,:,isuice), &
432 & ice(ng) % Si(:,:,:,isvice), &
433 & ice(ng) % Si(:,:,:,isiphy), &
434 & lbc(:,ibice(isiphy),ng))
435
436
437
438
439
440 CALL ice_mpdata_tile (ng, tile, model, &
441 & lbi, ubi, lbj, ubj, &
442 & imins, imaxs, jmins, jmaxs, &
443 & linew, liold, liunw, &
444# ifdef MASKING
445 & grid(ng) % rmask, &
446 & grid(ng) % umask, &
447 & grid(ng) % vmask, &
448# endif
449# ifdef WET_DRY
450 & grid(ng) % rmask_wet, &
451 & grid(ng) % umask_wet, &
452 & grid(ng) % vmask_wet, &
453# endif
454# ifdef ICESHELF
455 & grid(ng) % zice, &
456# endif
457# ifndef ICE_UPWIND
458 & grid(ng) % pm, &
459 & grid(ng) % pn, &
460# endif
461 & grid(ng) % on_u, &
462 & grid(ng) % om_v, &
463 & grid(ng) % omn, &
464 & ice(ng) % Si(:,:,:,isuice), &
465 & ice(ng) % Si(:,:,:,isvice), &
466 & ice(ng) % Si(:,:,:,isino3))
467
468 CALL ice_bc2d_tile (ng, tile, model, isino3, &
469 & lbi, ubi, lbj, ubj, &
470 & liold, linew, &
471 & ice(ng) % Si(:,:,:,isuice), &
472 & ice(ng) % Si(:,:,:,isvice), &
473 & ice(ng) % Si(:,:,:,isino3), &
474 & lbc(:,ibice(isino3),ng))
475
476
477
478
479
480 CALL ice_mpdata_tile (ng, tile, model, &
481 & lbi, ubi, lbj, ubj, &
482 & imins, imaxs, jmins, jmaxs, &
483 & linew, liold, liunw, &
484# ifdef MASKING
485 & grid(ng) % rmask, &
486 & grid(ng) % umask, &
487 & grid(ng) % vmask, &
488# endif
489# ifdef WET_DRY
490 & grid(ng) % rmask_wet, &
491 & grid(ng) % umask_wet, &
492 & grid(ng) % vmask_wet, &
493# endif
494# ifdef ICESHELF
495 & grid(ng) % zice, &
496# endif
497# ifndef ICE_UPWIND
498 & grid(ng) % pm, &
499 & grid(ng) % pn, &
500# endif
501 & grid(ng) % on_u, &
502 & grid(ng) % om_v, &
503 & grid(ng) % omn, &
504 & ice(ng) % Si(:,:,:,isuice), &
505 & ice(ng) % Si(:,:,:,isvice), &
506 & ice(ng) % Si(:,:,:,isinh4))
507
508 CALL ice_bc2d_tile (ng, tile, model, isinh4, &
509 & lbi, ubi, lbj, ubj, &
510 & liold, linew, &
511 & ice(ng) % Si(:,:,:,isuice), &
512 & ice(ng) % Si(:,:,:,isvice), &
513 & ice(ng) % Si(:,:,:,isinh4), &
514 & lbc(:,ibice(isinh4),ng))
515#endif
516
517
518
519
520
521 IF (ewperiodic(ng).or.nsperiodic(ng)) THEN
522 CALL exchange_r2d_tile (ng, tile, &
523 & lbi, ubi, lbj, ubj, &
524 & ice(ng)%Si(:,:,linew,isaice))
525
526 CALL exchange_r2d_tile (ng, tile, &
527 & lbi, ubi, lbj, ubj, &
528 & ice(ng)%Si(:,:,linew,ishice))
529
530#ifdef ICE_THERMO
531 CALL exchange_r2d_tile (ng, tile, &
532 & lbi, ubi, lbj, ubj, &
533 & ice(ng)%Si(:,:,linew,ishsno))
534
535 CALL exchange_r2d_tile (ng, tile, &
536 & lbi, ubi, lbj, ubj, &
537 & ice(ng)%Si(:,:,linew,ishmel))
538
539 CALL exchange_r2d_tile (ng, tile, &
540 & lbi, ubi, lbj, ubj, &
541 & ice(ng)%Si(:,:,linew,istice))
542
543 CALL exchange_r2d_tile (ng, tile, &
544 & lbi, ubi, lbj, ubj, &
545 & ice(ng)%Si(:,:,linew,isenth))
546
547 CALL exchange_r2d_tile (ng, tile, &
548 & lbi, ubi, lbj, ubj, &
549 & ice(ng)%Si(:,:,linew,isiage))
550
551 CALL exchange_r2d_tile (ng, tile, &
552 & lbi, ubi, lbj, ubj, &
553 & ice(ng)%Si(:,:,linew,ishage))
554
555# ifdef ICE_BIO
556 CALL exchange_r2d_tile (ng, tile, &
557 & lbi, ubi, lbj, ubj, &
558 & ice(ng)%Si(:,:,linew,isiphy))
559
560 CALL exchange_r2d_tile (ng, tile, &
561 & lbi, ubi, lbj, ubj, &
562 & ice(ng)%Si(:,:,linew,isino3))
563
564 CALL exchange_r2d_tile (ng, tile, &
565 & lbi, ubi, lbj, ubj, &
566 & ice(ng)%Si(:,:,linew,isinh4))
567# endif
568#endif
569 END IF
570
571#ifdef DISTRIBUTE
572
573 CALL mp_exchange2d (ng, tile, model, 2, &
574 & lbi, ubi, lbj, ubj, &
575 & nghostpoints, ewperiodic(ng), nsperiodic(ng), &
576 & ice(ng)%Si(:,:,linew,isaice), &
577 & ice(ng)%Si(:,:,linew,ishice))
578
579# ifdef ICE_THERMO
580 CALL mp_exchange2d (ng, tile, model, 2, &
581 & lbi, ubi, lbj, ubj, &
582 & nghostpoints, ewperiodic(ng), nsperiodic(ng), &
583 & ice(ng)%Si(:,:,linew,ishsno), &
584 & ice(ng)%Si(:,:,linew,ishmel))
585
586 CALL mp_exchange2d (ng, tile, model, 4, &
587 & lbi, ubi, lbj, ubj, &
588 & nghostpoints, ewperiodic(ng), nsperiodic(ng), &
589 & ice(ng)%Si(:,:,linew,istice), &
590 & ice(ng)%Si(:,:,linew,isenth), &
591 & ice(ng)%Si(:,:,linew,isiage), &
592 & ice(ng)%Si(:,:,linew,ishage))
593
594# if defined ICE_BIO
595 CALL mp_exchange2d (ng, tile, model, 3, &
596 & lbi, ubi, lbj, ubj, &
597 & nghostpoints, ewperiodic(ng), nsperiodic(ng), &
598 & ice(ng)%Si(:,:,linew,isiphy), &
599 & ice(ng)%Si(:,:,linew,isino3), &
600 & ice(ng)%Si(:,:,linew,isinh4))
601# endif
602# endif
603#endif
604
605 RETURN