/[MITgcm]/MITgcm_contrib/MPMice/beaufort/code/cpl_mpmice.F
ViewVC logotype

Contents of /MITgcm_contrib/MPMice/beaufort/code/cpl_mpmice.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.13 - (show annotations) (download)
Wed Mar 14 05:32:10 2012 UTC (13 years, 4 months ago) by dimitri
Branch: MAIN
Changes since 1.12: +171 -228 lines
updating to latest pkg/seaice

1 #define FIX_FOR_EDGE_WINDS
2 #include "PACKAGES_CONFIG.h"
3 #include "CPP_OPTIONS.h"
4
5 CBOP
6 C !ROUTINE: CPL_MPMICE
7 C !INTERFACE:
8 SUBROUTINE CPL_MPMICE( myTime, myIter, myThid )
9
10 C !DESCRIPTION: \bv
11 C *==================================================================
12 C | SUBROUTINE cpl_mpmice
13 C | o Couple MITgcm ocean model with MPMice sea ice model
14 C *==================================================================
15 C \ev
16
17 C !USES:
18 IMPLICIT NONE
19 C == Global variables ==
20 #include "SIZE.h"
21 #include "EEPARAMS.h"
22 #include "PARAMS.h"
23 #include "DYNVARS.h"
24 #include "GRID.h"
25 #include "FFIELDS.h"
26 #ifdef ALLOW_EXF
27 # include "EXF_OPTIONS.h"
28 # include "EXF_FIELDS.h"
29 #endif
30 #ifdef ALLOW_SEAICE
31 # include "SEAICE_OPTIONS.h"
32 # include "SEAICE_SIZE.h"
33 # include "SEAICE.h"
34 #endif
35
36 LOGICAL DIFFERENT_MULTIPLE
37 EXTERNAL DIFFERENT_MULTIPLE
38
39 C !LOCAL VARIABLES:
40 C mytime - time counter for this thread (seconds)
41 C myiter - iteration counter for this thread
42 C mythid - thread number for this instance of the routine.
43 _RL mytime
44 INTEGER myiter, mythid
45 CEOP
46
47 #ifdef ALLOW_CPL_MPMICE
48 # include "EESUPPORT.h"
49 # include "CPL_MPMICE.h"
50 COMMON /CPL_MPI_ID/
51 & myworldid, local_ocean_leader, local_ice_leader
52 integer myworldid, local_ocean_leader, local_ice_leader
53 # ifdef ALLOW_USE_MPI
54 integer mpistatus(MPI_STATUS_SIZE), mpierr
55 # endif /* ALLOW_USE_MPI */
56 integer xfer_gridsize(2)
57 integer i, j, bi, bj, buffsize, idx
58 Real*8 xfer_scalar
59 Real*8 xfer_array(Nx,Ny)
60 Real*8 xfer_bc_tracer(2*(Nx+Ny)-4)
61 Real*8 xfer_bc_veloc(2*(Nx+Ny)-6)
62 _RL local(1:sNx,1:sNy,nSx,nSy)
63
64 COMMON /FFIELDS_tmp/ fu_tmp, fv_tmp, Qnet_tmp, Qsw_tmp, EmPmR_tmp
65 _RS fu_tmp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
66 _RS fv_tmp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
67 _RS Qnet_tmp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
68 _RS Qsw_tmp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
69 _RS EmPmR_tmp (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
70
71 IF( myTime .EQ. startTime ) THEN
72
73 C Send deltatimestep
74 _BEGIN_MASTER( myThid )
75 xfer_scalar = deltat
76 buffsize = 1
77 # ifdef CPL_DEBUG
78 print*,'MITgcm send TimeInterval', xfer_scalar
79 # endif /* CPL_DEBUG */
80 # ifdef CPL_COUPLED
81 IF ( myworldid .EQ. local_ocean_leader ) THEN
82 CALL MPI_SEND(xfer_scalar,buffsize,MPI_DOUBLE_PRECISION,
83 & local_ice_leader,TimeIntervalTag,MPI_COMM_WORLD,mpierr)
84 ENDIF
85 # endif /* CPL_COUPLED */
86 _END_MASTER( myThid )
87
88 C Send grid dimensions (Nx,Ny)
89 _BEGIN_MASTER( myThid )
90 xfer_gridsize(1)=Nx
91 xfer_gridsize(2)=Ny
92 buffsize = 2
93 # ifdef CPL_DEBUG
94 print*,'MITgcm send OceanGridsize', xfer_gridsize
95 # endif /* CPL_DEBUG */
96 # ifdef CPL_COUPLED
97 IF ( myworldid .EQ. local_ocean_leader ) THEN
98 CALL MPI_SEND(xfer_gridsize,buffsize,MPI_INTEGER,
99 & local_ice_leader,OceanGridsizeTag,MPI_COMM_WORLD,mpierr)
100 ENDIF
101 # endif /* CPL_COUPLED */
102 _END_MASTER( myThid )
103
104 C Send ice area
105 DO bj=1,nSy
106 DO bi=1,nSx
107 DO j=1,sNy
108 DO i=1,sNx
109 local(i,j,bi,bj) = AREA(i,j,bi,bj)
110 ENDDO
111 ENDDO
112 ENDDO
113 ENDDO
114 CALL GATHER_2D( xfer_array, local, myThid )
115 # ifdef CPL_DEBUG
116 CALL PLOT_FIELD_XYRL( AREA, 'AREA', myIter, myThid )
117 # endif /* CPL_DEBUG */
118 # ifdef CPL_COUPLED
119 _BEGIN_MASTER( myThid )
120 IF ( myworldid .EQ. local_ocean_leader ) THEN
121 buffsize = Nx*Ny
122 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
123 & local_ice_leader,AreaTag,MPI_COMM_WORLD,mpierr)
124 ENDIF
125 _END_MASTER( myThid )
126 # endif /* CPL_COUPLED */
127
128 C Send ice thickness
129 DO bj=1,nSy
130 DO bi=1,nSx
131 DO j=1,sNy
132 DO i=1,sNx
133 local(i,j,bi,bj) = HEFF(i,j,bi,bj)
134 ENDDO
135 ENDDO
136 ENDDO
137 ENDDO
138 CALL GATHER_2D( xfer_array, local, myThid )
139 # ifdef CPL_DEBUG
140 CALL PLOT_FIELD_XYRL( HEFF, 'HEFF', myIter, myThid )
141 # endif /* CPL_DEBUG */
142 # ifdef CPL_COUPLED
143 _BEGIN_MASTER( myThid )
144 IF ( myworldid .EQ. local_ocean_leader ) THEN
145 buffsize = Nx*Ny
146 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
147 & local_ice_leader,HeffTag,MPI_COMM_WORLD,mpierr)
148 ENDIF
149 _END_MASTER( myThid )
150 # endif /* CPL_COUPLED */
151
152 C Send ice salinity
153 DO bj=1,nSy
154 DO bi=1,nSx
155 DO j=1,sNy
156 DO i=1,sNx
157 local(i,j,bi,bj) = HSALT(i,j,bi,bj)
158 ENDDO
159 ENDDO
160 ENDDO
161 ENDDO
162 CALL GATHER_2D( xfer_array, local, myThid )
163 # ifdef CPL_DEBUG
164 CALL PLOT_FIELD_XYRL( HSALT, 'HSALT', myIter, myThid )
165 # endif /* CPL_DEBUG */
166 # ifdef CPL_COUPLED
167 _BEGIN_MASTER( myThid )
168 IF ( myworldid .EQ. local_ocean_leader ) THEN
169 buffsize = Nx*Ny
170 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
171 & local_ice_leader,HsaltTag,MPI_COMM_WORLD,mpierr)
172 ENDIF
173 _END_MASTER( myThid )
174 # endif /* CPL_COUPLED */
175
176 C Send snow thickness
177 DO bj=1,nSy
178 DO bi=1,nSx
179 DO j=1,sNy
180 DO i=1,sNx
181 local(i,j,bi,bj) = HSNOW(i,j,bi,bj)
182 ENDDO
183 ENDDO
184 ENDDO
185 ENDDO
186 CALL GATHER_2D( xfer_array, local, myThid )
187 # ifdef CPL_DEBUG
188 CALL PLOT_FIELD_XYRL( HSNOW, 'HSNOW', myIter, myThid )
189 # endif /* CPL_DEBUG */
190 # ifdef CPL_COUPLED
191 _BEGIN_MASTER( myThid )
192 IF ( myworldid .EQ. local_ocean_leader ) THEN
193 buffsize = Nx*Ny
194 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
195 & local_ice_leader,HsnowTag,MPI_COMM_WORLD,mpierr)
196 ENDIF
197 _END_MASTER( myThid )
198 # endif /* CPL_COUPLED */
199
200 ENDIF ! ( myTime .EQ. startTime )
201
202 C Send ocean model time
203 _BEGIN_MASTER( myThid )
204 xfer_scalar = myTime
205 buffsize = 1
206 # ifdef CPL_DEBUG
207 print*,'MITgcm send OceanTime', xfer_scalar
208 # endif /* CPL_DEBUG */
209 # ifdef CPL_COUPLED
210 IF ( myworldid .EQ. local_ocean_leader ) THEN
211 CALL MPI_SEND(xfer_scalar,buffsize,MPI_DOUBLE_PRECISION,
212 & local_ice_leader,OceanTimeTag,MPI_COMM_WORLD,mpierr)
213 ENDIF
214 # endif /* CPL_COUPLED */
215 _END_MASTER( myThid )
216
217 C Send boundary ice area
218 DO bj=1,nSy
219 DO bi=1,nSx
220 DO j=1,sNy
221 DO i=1,sNx
222 local(i,j,bi,bj) = AREA(i,j,bi,bj)
223 ENDDO
224 ENDDO
225 ENDDO
226 ENDDO
227 CALL GATHER_2D( xfer_array, local, myThid )
228 idx = 0
229 DO i = 1, Nx
230 idx = idx + 1
231 xfer_bc_tracer(idx) = xfer_array(i,1)
232 ENDDO
233 DO j = 2, Ny
234 idx = idx + 1
235 xfer_bc_tracer(idx) = xfer_array(Nx,j)
236 ENDDO
237 DO i = (Nx-1), 1, -1
238 idx = idx + 1
239 xfer_bc_tracer(idx) = xfer_array(i,Ny)
240 ENDDO
241 DO j = (Ny-1), 2, -1
242 idx = idx + 1
243 xfer_bc_tracer(idx) = xfer_array(1,j)
244 ENDDO
245 # ifdef CPL_DEBUG
246 CALL PLOT_FIELD_XYRL( AREA, 'AREA obcs', myIter, myThid )
247 # endif /* CPL_DEBUG */
248 # ifdef CPL_COUPLED
249 _BEGIN_MASTER( myThid )
250 IF ( myworldid .EQ. local_ocean_leader ) THEN
251 buffsize = 2*(Nx+Ny)-4
252 cdb print*,'MITgcm is about to send AreaBcTag',buffsize
253 CALL MPI_SEND(xfer_bc_tracer,buffsize,MPI_DOUBLE_PRECISION,
254 & local_ice_leader,AreaBcTag,MPI_COMM_WORLD,mpierr)
255 cdb print*,'MITgcm has sent AreaBcTag',buffsize
256 ENDIF
257 _END_MASTER( myThid )
258 # endif /* CPL_COUPLED */
259
260 C Send boundary ice thickness
261 DO bj=1,nSy
262 DO bi=1,nSx
263 DO j=1,sNy
264 DO i=1,sNx
265 local(i,j,bi,bj) = HEFF(i,j,bi,bj)
266 ENDDO
267 ENDDO
268 ENDDO
269 ENDDO
270 CALL GATHER_2D( xfer_array, local, myThid )
271 idx = 0
272 DO i = 1, Nx
273 idx = idx + 1
274 xfer_bc_tracer(idx) = xfer_array(i,1)
275 ENDDO
276 DO j = 2, Ny
277 idx = idx + 1
278 xfer_bc_tracer(idx) = xfer_array(Nx,j)
279 ENDDO
280 DO i = (Nx-1), 1, -1
281 idx = idx + 1
282 xfer_bc_tracer(idx) = xfer_array(i,Ny)
283 ENDDO
284 DO j = (Ny-1), 2, -1
285 idx = idx + 1
286 xfer_bc_tracer(idx) = xfer_array(1,j)
287 ENDDO
288 # ifdef CPL_DEBUG
289 CALL PLOT_FIELD_XYRL( HEFF, 'HEFF obcs', myIter, myThid )
290 # endif /* CPL_DEBUG */
291 # ifdef CPL_COUPLED
292 _BEGIN_MASTER( myThid )
293 IF ( myworldid .EQ. local_ocean_leader ) THEN
294 buffsize = 2*(Nx+Ny)-4
295 CALL MPI_SEND(xfer_bc_tracer,buffsize,MPI_DOUBLE_PRECISION,
296 & local_ice_leader,HeffBcTag,MPI_COMM_WORLD,mpierr)
297 ENDIF
298 _END_MASTER( myThid )
299 # endif /* CPL_COUPLED */
300
301 C Send boundary ice salinity
302 DO bj=1,nSy
303 DO bi=1,nSx
304 DO j=1,sNy
305 DO i=1,sNx
306 local(i,j,bi,bj) = HSALT(i,j,bi,bj)
307 ENDDO
308 ENDDO
309 ENDDO
310 ENDDO
311 CALL GATHER_2D( xfer_array, local, myThid )
312 idx = 0
313 DO i = 1, Nx
314 idx = idx + 1
315 xfer_bc_tracer(idx) = xfer_array(i,1)
316 ENDDO
317 DO j = 2, Ny
318 idx = idx + 1
319 xfer_bc_tracer(idx) = xfer_array(Nx,j)
320 ENDDO
321 DO i = (Nx-1), 1, -1
322 idx = idx + 1
323 xfer_bc_tracer(idx) = xfer_array(i,Ny)
324 ENDDO
325 DO j = (Ny-1), 2, -1
326 idx = idx + 1
327 xfer_bc_tracer(idx) = xfer_array(1,j)
328 ENDDO
329 # ifdef CPL_DEBUG
330 CALL PLOT_FIELD_XYRL( HSALT, 'HSALT obcs', myIter, myThid )
331 # endif /* CPL_DEBUG */
332 # ifdef CPL_COUPLED
333 _BEGIN_MASTER( myThid )
334 IF ( myworldid .EQ. local_ocean_leader ) THEN
335 buffsize = 2*(Nx+Ny)-4
336 CALL MPI_SEND(xfer_bc_tracer,buffsize,MPI_DOUBLE_PRECISION,
337 & local_ice_leader,HsaltBcTag,MPI_COMM_WORLD,mpierr)
338 ENDIF
339 _END_MASTER( myThid )
340 # endif /* CPL_COUPLED */
341
342 C Send boundary snow thickness
343 DO bj=1,nSy
344 DO bi=1,nSx
345 DO j=1,sNy
346 DO i=1,sNx
347 local(i,j,bi,bj) = HSNOW(i,j,bi,bj)
348 ENDDO
349 ENDDO
350 ENDDO
351 ENDDO
352 CALL GATHER_2D( xfer_array, local, myThid )
353 idx = 0
354 DO i = 1, Nx
355 idx = idx + 1
356 xfer_bc_tracer(idx) = xfer_array(i,1)
357 ENDDO
358 DO j = 2, Ny
359 idx = idx + 1
360 xfer_bc_tracer(idx) = xfer_array(Nx,j)
361 ENDDO
362 DO i = (Nx-1), 1, -1
363 idx = idx + 1
364 xfer_bc_tracer(idx) = xfer_array(i,Ny)
365 ENDDO
366 DO j = (Ny-1), 2, -1
367 idx = idx + 1
368 xfer_bc_tracer(idx) = xfer_array(1,j)
369 ENDDO
370 # ifdef CPL_DEBUG
371 CALL PLOT_FIELD_XYRL( HSNOW, 'HSNOW obcs', myIter, myThid )
372 # endif /* CPL_DEBUG */
373 # ifdef CPL_COUPLED
374 _BEGIN_MASTER( myThid )
375 IF ( myworldid .EQ. local_ocean_leader ) THEN
376 buffsize = 2*(Nx+Ny)-4
377 CALL MPI_SEND(xfer_bc_tracer,buffsize,MPI_DOUBLE_PRECISION,
378 & local_ice_leader,HsnowBcTag,MPI_COMM_WORLD,mpierr)
379 ENDIF
380 _END_MASTER( myThid )
381 # endif /* CPL_COUPLED */
382
383 C Send boundary u ice
384 DO bj=1,nSy
385 DO bi=1,nSx
386 DO j=1,sNy
387 DO i=1,sNx
388 local(i,j,bi,bj) = UICE(i,j,bi,bj)
389 ENDDO
390 ENDDO
391 ENDDO
392 ENDDO
393 CALL GATHER_2D( xfer_array, local, myThid )
394 idx = 0
395 DO i = 2, Nx
396 idx = idx + 1
397 xfer_bc_veloc(idx) = xfer_array(i,1)
398 ENDDO
399 DO j = 2, Ny
400 idx = idx + 1
401 xfer_bc_veloc(idx) = xfer_array(Nx,j)
402 ENDDO
403 DO i = (Nx-1), 2, -1
404 idx = idx + 1
405 xfer_bc_veloc(idx) = xfer_array(i,Ny)
406 ENDDO
407 DO j = (Ny-1), 2, -1
408 idx = idx + 1
409 xfer_bc_veloc(idx) = xfer_array(2,j)
410 ENDDO
411 # ifdef CPL_DEBUG
412 CALL PLOT_FIELD_XYRL( UICE, 'UICE obcs', myIter, myThid )
413 # endif /* CPL_DEBUG */
414 # ifdef CPL_COUPLED
415 _BEGIN_MASTER( myThid )
416 IF ( myworldid .EQ. local_ocean_leader ) THEN
417 buffsize = 2*(Nx+Ny)-6
418 CALL MPI_SEND(xfer_bc_veloc,buffsize,MPI_DOUBLE_PRECISION,
419 & local_ice_leader,UiceBcTag,MPI_COMM_WORLD,mpierr)
420 ENDIF
421 _END_MASTER( myThid )
422 # endif /* CPL_COUPLED */
423
424 C Send boundary v ice
425 DO bj=1,nSy
426 DO bi=1,nSx
427 DO j=1,sNy
428 DO i=1,sNx
429 local(i,j,bi,bj) = VICE(i,j,bi,bj)
430 ENDDO
431 ENDDO
432 ENDDO
433 ENDDO
434 CALL GATHER_2D( xfer_array, local, myThid )
435 idx = 0
436 DO i = 1, Nx
437 idx = idx + 1
438 xfer_bc_veloc(idx) = xfer_array(i,2)
439 ENDDO
440 DO j = 3, Ny
441 idx = idx + 1
442 xfer_bc_veloc(idx) = xfer_array(Nx,j)
443 ENDDO
444 DO i = (Nx-1), 1, -1
445 idx = idx + 1
446 xfer_bc_veloc(idx) = xfer_array(i,Ny)
447 ENDDO
448 DO j = (Ny-1), 3, -1
449 idx = idx + 1
450 xfer_bc_veloc(idx) = xfer_array(1,j)
451 ENDDO
452 # ifdef CPL_DEBUG
453 CALL PLOT_FIELD_XYRL( VICE, 'VICE obcs', myIter, myThid )
454 # endif /* CPL_DEBUG */
455 # ifdef CPL_COUPLED
456 _BEGIN_MASTER( myThid )
457 IF ( myworldid .EQ. local_ocean_leader ) THEN
458 buffsize = 2*(Nx+Ny)-6
459 CALL MPI_SEND(xfer_bc_veloc,buffsize,MPI_DOUBLE_PRECISION,
460 & local_ice_leader,ViceBcTag,MPI_COMM_WORLD,mpierr)
461 ENDIF
462 _END_MASTER( myThid )
463 # endif /* CPL_COUPLED */
464
465 C Send u-wind velocity
466 DO bj=1,nSy
467 DO bi=1,nSx
468 DO j=1,sNy
469 DO i=1,sNx
470 local(i,j,bi,bj) = uwind(i,j,bi,bj)
471 ENDDO
472 ENDDO
473 ENDDO
474 ENDDO
475 CALL GATHER_2D( xfer_array, local, myThid )
476 # ifdef CPL_DEBUG
477 CALL PLOT_FIELD_XYRL( UWIND, 'UWIND', myIter, myThid )
478 # endif /* CPL_DEBUG */
479 # ifdef CPL_COUPLED
480 _BEGIN_MASTER( myThid )
481 IF ( myworldid .EQ. local_ocean_leader ) THEN
482 # ifdef FIX_FOR_EDGE_WINDS
483 DO j=1,Ny
484 xfer_array(Nx,j)=xfer_array(Nx-1,j)
485 ENDDO
486 # endif /* FIX_FOR_EDGE_WINDS */
487 buffsize = Nx*Ny
488 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
489 & local_ice_leader,UwindTag,MPI_COMM_WORLD,mpierr)
490 ENDIF
491 _END_MASTER( myThid )
492 # endif /* CPL_COUPLED */
493
494 C Send v-wind velocity
495 DO bj=1,nSy
496 DO bi=1,nSx
497 DO j=1,sNy
498 DO i=1,sNx
499 local(i,j,bi,bj) = vwind(i,j,bi,bj)
500 ENDDO
501 ENDDO
502 ENDDO
503 ENDDO
504 CALL GATHER_2D( xfer_array, local, myThid )
505 # ifdef CPL_DEBUG
506 CALL PLOT_FIELD_XYRL( VWIND, 'VWIND', myIter, myThid )
507 # endif /* CPL_DEBUG */
508 # ifdef CPL_COUPLED
509 _BEGIN_MASTER( myThid )
510 IF ( myworldid .EQ. local_ocean_leader ) THEN
511 # ifdef FIX_FOR_EDGE_WINDS
512 DO i=1,Nx
513 xfer_array(i,Ny)=xfer_array(i,Ny-1)
514 ENDDO
515 # endif /* FIX_FOR_EDGE_WINDS */
516 buffsize = Nx*Ny
517 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
518 & local_ice_leader,VwindTag,MPI_COMM_WORLD,mpierr)
519 ENDIF
520 _END_MASTER( myThid )
521 # endif /* CPL_COUPLED */
522
523 C Send downward longwave radiation
524 DO bj=1,nSy
525 DO bi=1,nSx
526 DO j=1,sNy
527 DO i=1,sNx
528 local(i,j,bi,bj) = lwdown(i,j,bi,bj)
529 ENDDO
530 ENDDO
531 ENDDO
532 ENDDO
533 CALL GATHER_2D( xfer_array, local, myThid )
534 # ifdef CPL_DEBUG
535 CALL PLOT_FIELD_XYRL( LWDOWN, 'LWDOWN', myIter, myThid )
536 # endif /* CPL_DEBUG */
537 # ifdef CPL_COUPLED
538 _BEGIN_MASTER( myThid )
539 IF ( myworldid .EQ. local_ocean_leader ) THEN
540 buffsize = Nx*Ny
541 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
542 & local_ice_leader,LwDownTag,MPI_COMM_WORLD,mpierr)
543 ENDIF
544 _END_MASTER( myThid )
545 # endif /* CPL_COUPLED */
546
547 C Send downward shortwave radiation
548 DO bj=1,nSy
549 DO bi=1,nSx
550 DO j=1,sNy
551 DO i=1,sNx
552 local(i,j,bi,bj) = swdown(i,j,bi,bj)
553 ENDDO
554 ENDDO
555 ENDDO
556 ENDDO
557 CALL GATHER_2D( xfer_array, local, myThid )
558 # ifdef CPL_DEBUG
559 CALL PLOT_FIELD_XYRL( SWDOWN, 'SWDOWN', myIter, myThid )
560 # endif /* CPL_DEBUG */
561 # ifdef CPL_COUPLED
562 _BEGIN_MASTER( myThid )
563 IF ( myworldid .EQ. local_ocean_leader ) THEN
564 buffsize = Nx*Ny
565 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
566 & local_ice_leader,SwDownTag,MPI_COMM_WORLD,mpierr)
567 ENDIF
568 _END_MASTER( myThid )
569 # endif /* CPL_COUPLED */
570
571 C Send air temperature
572 DO bj=1,nSy
573 DO bi=1,nSx
574 DO j=1,sNy
575 DO i=1,sNx
576 local(i,j,bi,bj) = atemp(i,j,bi,bj)
577 ENDDO
578 ENDDO
579 ENDDO
580 ENDDO
581 CALL GATHER_2D( xfer_array, local, myThid )
582 # ifdef CPL_DEBUG
583 CALL PLOT_FIELD_XYRL( ATEMP, 'ATEMP', myIter, myThid )
584 # endif /* CPL_DEBUG */
585 # ifdef CPL_COUPLED
586 _BEGIN_MASTER( myThid )
587 IF ( myworldid .EQ. local_ocean_leader ) THEN
588 buffsize = Nx*Ny
589 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
590 & local_ice_leader,AtempTag,MPI_COMM_WORLD,mpierr)
591 ENDIF
592 _END_MASTER( myThid )
593 # endif /* CPL_COUPLED */
594
595 C Send humidity
596 DO bj=1,nSy
597 DO bi=1,nSx
598 DO j=1,sNy
599 DO i=1,sNx
600 local(i,j,bi,bj) = aqh(i,j,bi,bj)
601 ENDDO
602 ENDDO
603 ENDDO
604 ENDDO
605 CALL GATHER_2D( xfer_array, local, myThid )
606 # ifdef CPL_DEBUG
607 CALL PLOT_FIELD_XYRL( AQH, 'AQH', myIter, myThid )
608 # endif /* CPL_DEBUG */
609 # ifdef CPL_COUPLED
610 _BEGIN_MASTER( myThid )
611 IF ( myworldid .EQ. local_ocean_leader ) THEN
612 buffsize = Nx*Ny
613 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
614 & local_ice_leader,AqhTag,MPI_COMM_WORLD,mpierr)
615 ENDIF
616 _END_MASTER( myThid )
617 # endif /* CPL_COUPLED */
618
619 C Send precipitation
620 DO bj=1,nSy
621 DO bi=1,nSx
622 DO j=1,sNy
623 DO i=1,sNx
624 local(i,j,bi,bj) = precip(i,j,bi,bj)
625 ENDDO
626 ENDDO
627 ENDDO
628 ENDDO
629 CALL GATHER_2D( xfer_array, local, myThid )
630 # ifdef CPL_DEBUG
631 CALL PLOT_FIELD_XYRL( PRECIP, 'PRECIP', myIter, myThid )
632 # endif /* CPL_DEBUG */
633 # ifdef CPL_COUPLED
634 _BEGIN_MASTER( myThid )
635 IF ( myworldid .EQ. local_ocean_leader ) THEN
636 buffsize = Nx*Ny
637 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
638 & local_ice_leader,PrecipTag,MPI_COMM_WORLD,mpierr)
639 ENDIF
640 _END_MASTER( myThid )
641 # endif /* CPL_COUPLED */
642
643 C Send ocean surface temperature
644 DO bj=1,nSy
645 DO bi=1,nSx
646 DO j=1,sNy
647 DO i=1,sNx
648 local(i,j,bi,bj) = theta(i,j,1,bi,bj)
649 ENDDO
650 ENDDO
651 ENDDO
652 ENDDO
653 CALL GATHER_2D( xfer_array, local, myThid )
654 # ifdef CPL_DEBUG
655 CALL PLOT_FIELD_XYZRL( THETA, 'SST', 1, myIter, myThid )
656 # endif /* CPL_DEBUG */
657 # ifdef CPL_COUPLED
658 _BEGIN_MASTER( myThid )
659 IF ( myworldid .EQ. local_ocean_leader ) THEN
660 buffsize = Nx*Ny
661 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
662 & local_ice_leader,SstTag,MPI_COMM_WORLD,mpierr)
663 ENDIF
664 _END_MASTER( myThid )
665 # endif /* CPL_COUPLED */
666
667 C Send ocean surface salinity
668 DO bj=1,nSy
669 DO bi=1,nSx
670 DO j=1,sNy
671 DO i=1,sNx
672 local(i,j,bi,bj) = salt(i,j,1,bi,bj)
673 ENDDO
674 ENDDO
675 ENDDO
676 ENDDO
677 CALL GATHER_2D( xfer_array, local, myThid )
678 # ifdef CPL_DEBUG
679 CALL PLOT_FIELD_XYZRL( SALT, 'SSS', 1, myIter, myThid )
680 # endif /* CPL_DEBUG */
681 # ifdef CPL_COUPLED
682 _BEGIN_MASTER( myThid )
683 IF ( myworldid .EQ. local_ocean_leader ) THEN
684 buffsize = Nx*Ny
685 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
686 & local_ice_leader,SssTag,MPI_COMM_WORLD,mpierr)
687 ENDIF
688 _END_MASTER( myThid )
689 # endif /* CPL_COUPLED */
690
691 C Send surface u current
692 DO bj=1,nSy
693 DO bi=1,nSx
694 DO j=1,sNy
695 DO i=1,sNx
696 local(i,j,bi,bj) = uVel(i,j,1,bi,bj)
697 ENDDO
698 ENDDO
699 ENDDO
700 ENDDO
701 CALL GATHER_2D( xfer_array, local, myThid )
702 # ifdef CPL_DEBUG
703 CALL PLOT_FIELD_XYZRL( uVel, 'uVel(k=1)', 1, myIter, myThid )
704 # endif /* CPL_DEBUG */
705 # ifdef CPL_COUPLED
706 _BEGIN_MASTER( myThid )
707 IF ( myworldid .EQ. local_ocean_leader ) THEN
708 buffsize = Nx*Ny
709 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
710 & local_ice_leader,UvelTag,MPI_COMM_WORLD,mpierr)
711 ENDIF
712 _END_MASTER( myThid )
713 # endif /* CPL_COUPLED */
714
715 C Send surface v current
716 DO bj=1,nSy
717 DO bi=1,nSx
718 DO j=1,sNy
719 DO i=1,sNx
720 local(i,j,bi,bj) = vVel(i,j,1,bi,bj)
721 ENDDO
722 ENDDO
723 ENDDO
724 ENDDO
725 CALL GATHER_2D( xfer_array, local, myThid )
726 # ifdef CPL_DEBUG
727 CALL PLOT_FIELD_XYZRL( vVel, 'vVel(k=1)', 1, myIter, myThid )
728 # endif /* CPL_DEBUG */
729 # ifdef CPL_COUPLED
730 _BEGIN_MASTER( myThid )
731 IF ( myworldid .EQ. local_ocean_leader ) THEN
732 buffsize = Nx*Ny
733 CALL MPI_SEND(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
734 & local_ice_leader,VvelTag,MPI_COMM_WORLD,mpierr)
735 ENDIF
736 _END_MASTER( myThid )
737 # endif /* CPL_COUPLED */
738
739 C Receive ice model time
740 _BEGIN_MASTER( myThid )
741 # ifdef CPL_DEBUG
742 print*,'MITgcm receive IceTime'
743 # endif /* CPL_DEBUG */
744 # ifdef CPL_COUPLED
745 IF ( myworldid .EQ. local_ocean_leader ) THEN
746 buffsize = 1
747 CALL MPI_RECV(xfer_scalar,1,MPI_DOUBLE_PRECISION,
748 & local_ice_leader,IceTimeTag,MPI_COMM_WORLD,mpistatus,mpierr)
749 ENDIF
750 # endif /* CPL_COUPLED */
751 _END_MASTER( myThid )
752
753 C Receive ice area Nx*Ny Real*8
754 # ifdef CPL_COUPLED
755 _BEGIN_MASTER( myThid )
756 IF ( myworldid .EQ. local_ocean_leader ) THEN
757 buffsize = Nx*Ny
758 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
759 & local_ice_leader,AreaTag,MPI_COMM_WORLD,mpistatus,mpierr)
760 ENDIF
761 _END_MASTER( myThid )
762 CALL SCATTER_2D( xfer_array, local, myThid )
763 DO bj=1,nSy
764 DO bi=1,nSx
765 DO j=1,sNy
766 DO i=1,sNx
767 AREA(i,j,bi,bj) = local(i,j,bi,bj)
768 ENDDO
769 ENDDO
770 ENDDO
771 ENDDO
772 # endif /* CPL_COUPLED */
773 # ifdef CPL_DEBUG
774 CALL PLOT_FIELD_XYRL( AREA, 'ice area', myIter, myThid )
775 # endif /* CPL_DEBUG */
776
777 C Receive ice thickness
778 # ifdef CPL_COUPLED
779 _BEGIN_MASTER( myThid )
780 IF ( myworldid .EQ. local_ocean_leader ) THEN
781 buffsize = Nx*Ny
782 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
783 & local_ice_leader,HeffTag,MPI_COMM_WORLD,mpistatus,mpierr)
784 ENDIF
785 _END_MASTER( myThid )
786 CALL SCATTER_2D( xfer_array, local, myThid )
787 DO bj=1,nSy
788 DO bi=1,nSx
789 DO j=1,sNy
790 DO i=1,sNx
791 HEFF(i,j,bi,bj) = local(i,j,bi,bj)
792 ENDDO
793 ENDDO
794 ENDDO
795 ENDDO
796 # endif /* CPL_COUPLED */
797 # ifdef CPL_DEBUG
798 CALL PLOT_FIELD_XYRL( HEFF, 'ice thickness', myIter, myThid )
799 # endif /* CPL_DEBUG */
800
801 C Receive ice salinity
802 # ifdef CPL_COUPLED
803 _BEGIN_MASTER( myThid )
804 IF ( myworldid .EQ. local_ocean_leader ) THEN
805 buffsize = Nx*Ny
806 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
807 & local_ice_leader,HsaltTag,MPI_COMM_WORLD,mpistatus,mpierr)
808 ENDIF
809 _END_MASTER( myThid )
810 CALL SCATTER_2D( xfer_array, local, myThid )
811 DO bj=1,nSy
812 DO bi=1,nSx
813 DO j=1,sNy
814 DO i=1,sNx
815 HSALT(i,j,bi,bj) = local(i,j,bi,bj)
816 ENDDO
817 ENDDO
818 ENDDO
819 ENDDO
820 # endif /* CPL_COUPLED */
821 # ifdef CPL_DEBUG
822 CALL PLOT_FIELD_XYRL( HSALT, 'ice salinity', myIter, myThid )
823 # endif /* CPL_DEBUG */
824
825 C Receive snow thickness
826 # ifdef CPL_COUPLED
827 _BEGIN_MASTER( myThid )
828 IF ( myworldid .EQ. local_ocean_leader ) THEN
829 buffsize = Nx*Ny
830 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
831 & local_ice_leader,HsnowTag,MPI_COMM_WORLD,mpistatus,mpierr)
832 ENDIF
833 _END_MASTER( myThid )
834 CALL SCATTER_2D( xfer_array, local, myThid )
835 DO bj=1,nSy
836 DO bi=1,nSx
837 DO j=1,sNy
838 DO i=1,sNx
839 HSNOW(i,j,bi,bj) = local(i,j,bi,bj)
840 ENDDO
841 ENDDO
842 ENDDO
843 ENDDO
844 # endif /* CPL_COUPLED */
845 # ifdef CPL_DEBUG
846 CALL PLOT_FIELD_XYRL( HSNOW, 'snow thickness', myIter, myThid )
847 # endif /* CPL_DEBUG */
848
849 C Receive u surface stress
850 # ifdef CPL_COUPLED
851 _BEGIN_MASTER( myThid )
852 IF ( myworldid .EQ. local_ocean_leader ) THEN
853 buffsize = Nx*Ny
854 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
855 & local_ice_leader,UstressTag,MPI_COMM_WORLD,mpistatus,mpierr)
856 ENDIF
857 _END_MASTER( myThid )
858 CALL SCATTER_2D( xfer_array, local, myThid )
859 DO bj=1,nSy
860 DO bi=1,nSx
861 DO j=1,sNy
862 DO i=1,sNx
863 fu(i,j,bi,bj) = AREA(i,j,bi,bj) * local(i,j,bi,bj) +
864 & (1.-AREA(i,j,bi,bj)) * fu_tmp(i,j,bi,bj)
865 ENDDO
866 ENDDO
867 ENDDO
868 ENDDO
869 # ifdef CPL_DEBUG
870 CALL PLOT_FIELD_XYRL( local, 'mpm u stress', myIter, myThid )
871 # endif /* CPL_DEBUG */
872 # endif /* CPL_COUPLED */
873 # ifdef CPL_DEBUG
874 CALL PLOT_FIELD_XYRL( fu, 'u stress', myIter, myThid )
875 # endif /* CPL_DEBUG */
876
877 C Receive v surface stress
878 # ifdef CPL_COUPLED
879 _BEGIN_MASTER( myThid )
880 IF ( myworldid .EQ. local_ocean_leader ) THEN
881 buffsize = Nx*Ny
882 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
883 & local_ice_leader,VstressTag,MPI_COMM_WORLD,mpistatus,mpierr)
884 ENDIF
885 _END_MASTER( myThid )
886 CALL SCATTER_2D( xfer_array, local, myThid )
887 DO bj=1,nSy
888 DO bi=1,nSx
889 DO j=1,sNy
890 DO i=1,sNx
891 fv(i,j,bi,bj) = AREA(i,j,bi,bj) * local(i,j,bi,bj) +
892 & (1.-AREA(i,j,bi,bj)) * fv_tmp(i,j,bi,bj)
893 ENDDO
894 ENDDO
895 ENDDO
896 ENDDO
897 # ifdef CPL_DEBUG
898 CALL PLOT_FIELD_XYRL( local, 'mpm v stress', myIter, myThid )
899 # endif /* CPL_DEBUG */
900 # endif /* CPL_COUPLED */
901 # ifdef CPL_DEBUG
902 CALL PLOT_FIELD_XYRL( fv, 'v stress', myIter, myThid )
903 # endif /* CPL_DEBUG */
904
905 C Receive residual shortwave
906 # ifdef CPL_COUPLED
907 _BEGIN_MASTER( myThid )
908 IF ( myworldid .EQ. local_ocean_leader ) THEN
909 buffsize = Nx*Ny
910 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
911 & local_ice_leader,SwResidTag,MPI_COMM_WORLD,mpistatus,mpierr)
912 ENDIF
913 _END_MASTER( myThid )
914 CALL SCATTER_2D( xfer_array, local, myThid )
915 DO bj=1,nSy
916 DO bi=1,nSx
917 DO j=1,sNy
918 DO i=1,sNx
919 Qsw(i,j,bi,bj) = -AREA(i,j,bi,bj) * local(i,j,bi,bj) +
920 & (1.-AREA(i,j,bi,bj)) * Qsw_tmp(i,j,bi,bj)
921 ENDDO
922 ENDDO
923 ENDDO
924 ENDDO
925 # ifdef CPL_DEBUG
926 CALL PLOT_FIELD_XYRL( local, 'mpm shortwave', myIter, myThid )
927 # endif /* CPL_DEBUG */
928 # endif /* CPL_COUPLED */
929 # ifdef CPL_DEBUG
930 CALL PLOT_FIELD_XYRL( Qsw, 'shortwave', myIter, myThid )
931 # endif /* CPL_DEBUG */
932
933 C Receive heat flux
934 # ifdef CPL_COUPLED
935 _BEGIN_MASTER( myThid )
936 IF ( myworldid .EQ. local_ocean_leader ) THEN
937 buffsize = Nx*Ny
938 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
939 & local_ice_leader,HeatFluxTag,MPI_COMM_WORLD,mpistatus,mpierr)
940 ENDIF
941 _END_MASTER( myThid )
942 CALL SCATTER_2D( xfer_array, local, myThid )
943 DO bj=1,nSy
944 DO bi=1,nSx
945 DO j=1,sNy
946 DO i=1,sNx
947 Qnet(i,j,bi,bj) = Qsw(i,j,bi,bj) -
948 & AREA(i,j,bi,bj) * local(i,j,bi,bj) +
949 & (1.-AREA(i,j,bi,bj)) * Qnet_tmp(i,j,bi,bj)
950 ENDDO
951 ENDDO
952 ENDDO
953 ENDDO
954 # ifdef CPL_DEBUG
955 CALL PLOT_FIELD_XYRL( local, 'mpm heat flux', myIter, myThid )
956 # endif /* CPL_DEBUG */
957 # endif /* CPL_COUPLED */
958 # ifdef CPL_DEBUG
959 CALL PLOT_FIELD_XYRL( Qnet, 'heat flux', myIter, myThid )
960 # endif /* CPL_DEBUG */
961
962 C Receive freshwater flux
963 # ifdef CPL_COUPLED
964 _BEGIN_MASTER( myThid )
965 IF ( myworldid .EQ. local_ocean_leader ) THEN
966 buffsize = Nx*Ny
967 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
968 & local_ice_leader,WaterFluxTag,MPI_COMM_WORLD,mpistatus,mpierr)
969 ENDIF
970 _END_MASTER( myThid )
971 CALL SCATTER_2D( xfer_array, local, myThid )
972 DO bj=1,nSy
973 DO bi=1,nSx
974 DO j=1,sNy
975 DO i=1,sNx
976 EmPmR(i,j,bi,bj) = - AREA(i,j,bi,bj) * local (i,j,bi,bj) +
977 & ( 1. - AREA(i,j,bi,bj)) * EmPmR_tmp(i,j,bi,bj)
978 ENDDO
979 ENDDO
980 ENDDO
981 ENDDO
982 # ifdef CPL_DEBUG
983 CALL PLOT_FIELD_XYRL( local, 'mpm freshwater', myIter, myThid )
984 # endif /* CPL_DEBUG */
985 # endif /* CPL_COUPLED */
986 # ifdef CPL_DEBUG
987 CALL PLOT_FIELD_XYRL( EmPmR, 'freshwater', myIter, myThid )
988 # endif /* CPL_DEBUG */
989
990 C Receive salt flux
991 # ifdef CPL_COUPLED
992 _BEGIN_MASTER( myThid )
993 IF ( myworldid .EQ. local_ocean_leader ) THEN
994 buffsize = Nx*Ny
995 CALL MPI_RECV(xfer_array,buffsize,MPI_DOUBLE_PRECISION,
996 & local_ice_leader,SaltFluxTag,MPI_COMM_WORLD,mpistatus,mpierr)
997 ENDIF
998 _END_MASTER( myThid )
999 CALL SCATTER_2D( xfer_array, local, myThid )
1000 DO bj=1,nSy
1001 DO bi=1,nSx
1002 DO j=1,sNy
1003 DO i=1,sNx
1004 saltFlux(i,j,bi,bj) = - AREA(i,j,bi,bj) * local(i,j,bi,bj)
1005 ENDDO
1006 ENDDO
1007 ENDDO
1008 ENDDO
1009 # ifdef CPL_DEBUG
1010 CALL PLOT_FIELD_XYRL( local, 'mpm salt flux', myIter, myThid )
1011 # endif /* CPL_DEBUG */
1012 # endif /* CPL_COUPLED */
1013 # ifdef CPL_DEBUG
1014 CALL PLOT_FIELD_XYRL( saltFlux, 'salt flux', myIter, myThid )
1015 # endif /* CPL_DEBUG */
1016
1017 #endif /* ALLOW_CPL_MPMICE */
1018
1019 RETURN
1020 END

  ViewVC Help
Powered by ViewVC 1.1.22