144
145
148
149
150
151 integer, intent(in) :: ng, tile
152 integer, intent(in) :: LBi, UBi, LBj, UBj
153 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
154 integer, intent(in) :: nrhs, nnew
155
156#ifdef ASSUMED_SHAPE
157# ifdef MASKING
158 real(r8), intent(in) :: pmask(LBi:,LBj:)
159 real(r8), intent(in) :: rmask(LBi:,LBj:)
160 real(r8), intent(in) :: umask(LBi:,LBj:)
161 real(r8), intent(in) :: vmask(LBi:,LBj:)
162# endif
163 real(r8), intent(in) :: om_p(LBi:,LBj:)
164 real(r8), intent(in) :: om_r(LBi:,LBj:)
165 real(r8), intent(in) :: om_u(LBi:,LBj:)
166 real(r8), intent(in) :: om_v(LBi:,LBj:)
167 real(r8), intent(in) :: on_p(LBi:,LBj:)
168 real(r8), intent(in) :: on_r(LBi:,LBj:)
169 real(r8), intent(in) :: on_u(LBi:,LBj:)
170 real(r8), intent(in) :: on_v(LBi:,LBj:)
171 real(r8), intent(in) :: pm(LBi:,LBj:)
172 real(r8), intent(in) :: pn(LBi:,LBj:)
173 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
174 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
175# ifdef VISC_3DCOEF
176 real(r8), intent(in) :: visc3d_r(LBi:,LBj:,:)
177# else
178 real(r8), intent(in) :: visc2_p(LBi:,LBj:)
179 real(r8), intent(in) :: visc2_r(LBi:,LBj:)
180# endif
181 real(r8), intent(in) :: u(LBi:,LBj:,:,:)
182 real(r8), intent(in) :: v(LBi:,LBj:,:,:)
183
184# ifdef DIAGNOSTICS_UV
185
186
187
188
189# endif
190 real(r8), intent(inout) :: ad_Hz(LBi:,LBj:,:)
191 real(r8), intent(inout) :: ad_z_r(LBi:,LBj:,:)
192 real(r8), intent(inout) :: ad_rufrc(LBi:,LBj:)
193 real(r8), intent(inout) :: ad_rvfrc(LBi:,LBj:)
194 real(r8), intent(inout) :: ad_u(LBi:,LBj:,:,:)
195 real(r8), intent(inout) :: ad_v(LBi:,LBj:,:,:)
196# ifdef VISC_3DCOEF
197 real(r8), intent(inout) :: ad_visc3d_r(LBi:,LBj:,:)
198# endif
199#else
200# ifdef MASKING
201 real(r8), intent(in) :: pmask(LBi:UBi,LBj:UBj)
202 real(r8), intent(in) :: rmask(LBi:UBi,LBj:UBj)
203 real(r8), intent(in) :: umask(LBi:UBi,LBj:UBj)
204 real(r8), intent(in) :: vmask(LBi:UBi,LBj:UBj)
205# endif
206 real(r8), intent(in) :: om_p(LBi:UBi,LBj:UBj)
207 real(r8), intent(in) :: om_r(LBi:UBi,LBj:UBj)
208 real(r8), intent(in) :: om_u(LBi:UBi,LBj:UBj)
209 real(r8), intent(in) :: om_v(LBi:UBi,LBj:UBj)
210 real(r8), intent(in) :: on_p(LBi:UBi,LBj:UBj)
211 real(r8), intent(in) :: on_r(LBi:UBi,LBj:UBj)
212 real(r8), intent(in) :: on_u(LBi:UBi,LBj:UBj)
213 real(r8), intent(in) :: on_v(LBi:UBi,LBj:UBj)
214 real(r8), intent(in) :: pm(LBi:UBi,LBj:UBj)
215 real(r8), intent(in) :: pn(LBi:UBi,LBj:UBj)
216 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
217 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
218 real(r8), intent(in) :: visc2_p(LBi:UBi,LBj:UBj)
219 real(r8), intent(in) :: visc2_r(LBi:UBi,LBj:UBj)
220
221 real(r8), intent(in) :: u(LBi:UBi,LBj:UBj,N(ng),2)
222 real(r8), intent(in) :: v(LBi:UBi,LBj:UBj,N(ng),2)
223
224# ifdef DIAGNOSTICS_UV
225
226
227
228
229# endif
230
231 real(r8), intent(inout) :: ad_Hz(LBi:UBi,LBj:UBj,N(ng))
232 real(r8), intent(inout) :: ad_z_r(LBi:UBi,LBj:UBj,N(ng))
233 real(r8), intent(inout) :: ad_rufrc(LBi:UBi,LBj:UBj)
234 real(r8), intent(inout) :: ad_rvfrc(LBi:UBi,LBj:UBj)
235 real(r8), intent(inout) :: ad_u(LBi:UBi,LBj:UBj,N(ng),2)
236 real(r8), intent(inout) :: ad_v(LBi:UBi,LBj:UBj,N(ng),2)
237# ifdef VISC_3DCOEF
238 real(r8), intent(inout) :: ad_visc3d_r(LBi:UBi,LBj:UBj,N(ng))
239# endif
240
241#endif
242
243
244
245 integer :: i, j, k, kk, kt, k1, k1b, k2, k2b
246
247 real(r8) :: cff, fac1, fac2, pm_p, pn_p
248 real(r8) :: cff1, cff2, cff3, cff4
249 real(r8) :: cff5, cff6, cff7, cff8
250 real(r8) :: dmUdz, dnUdz, dmVdz, dnVdz
251#ifdef VISC_3DCOEF
252 real(r8) :: visc_p
253 real(r8) :: ad_fac1, ad_fac2, ad_visc_p
254#endif
255 real(r8) :: adfac, ad_cff
256 real(r8) :: adfac1, adfac2, adfac3, adfac4, adfac5, adfac6
257 real(r8) :: ad_cff1, ad_cff2, ad_cff3, ad_cff4
258 real(r8) :: ad_cff5, ad_cff6, ad_cff7, ad_cff8
259 real(r8) :: ad_dmUdz, ad_dnUdz, ad_dmVdz, ad_dnVdz
260
261 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: UFx
262 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: VFe
263
264 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_UFe
265 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_UFx
266 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_VFe
267 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_VFx
268
269 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dmUde
270 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dmVde
271 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dnUdx
272 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dnVdx
273 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dUdz
274 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dVdz
275 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZde_p
276 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZde_r
277 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZdx_p
278 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZdx_r
279
280 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_UFse
281 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_UFsx
282 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_VFse
283 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_VFsx
284 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dmUde
285 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dmVde
286 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dnUdx
287 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dnVdx
288 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dUdz
289 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dVdz
290 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dZde_p
291 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dZde_r
292 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dZdx_p
293 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: ad_dZdx_r
294
295#include "set_bounds.h"
296
297
298
299
300
301 ad_cff=0.0_r8
302 ad_cff1=0.0_r8
303 ad_cff2=0.0_r8
304 ad_cff3=0.0_r8
305 ad_cff4=0.0_r8
306 ad_cff5=0.0_r8
307 ad_cff6=0.0_r8
308 ad_cff7=0.0_r8
309 ad_cff8=0.0_r8
310
311#ifdef VISC_3DCOEF
312 ad_fac1=0.0_r8
313 ad_fac2=0.0_r8
314 ad_visc_p=0.0_r8
315#endif
316
317 ad_dmudz=0.0_r8
318 ad_dnudz=0.0_r8
319 ad_dmvdz=0.0_r8
320 ad_dnvdz=0.0_r8
321
322 ad_ufe(imins:imaxs,jmins:jmaxs)=0.0_r8
323 ad_ufx(imins:imaxs,jmins:jmaxs)=0.0_r8
324 ad_vfe(imins:imaxs,jmins:jmaxs)=0.0_r8
325 ad_vfx(imins:imaxs,jmins:jmaxs)=0.0_r8
326
327 ad_ufse(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
328 ad_ufsx(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
329 ad_vfse(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
330 ad_vfsx(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
331
332 ad_dmude(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
333 ad_dmvde(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
334 ad_dnudx(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
335 ad_dnvdx(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
336
337 ad_dudz(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
338 ad_dvdz(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
339
340 ad_dzde_p(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
341 ad_dzde_r(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
342 ad_dzdx_p(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
343 ad_dzdx_r(imins:imaxs,jmins:jmaxs,1:2)=0.0_r8
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365 k1=2
366 k2=1
368 k1=k2
369 k2=3-k1
370 END DO
371
372
373
374
375 k_loop :
DO k=
n(ng),0,-1
376 k2b=1
377 DO kk=0,k
378 k1b=k2b
379 k2b=3-k1b
380 IF (kk.lt.
n(ng))
THEN
381
382
383
384 DO j=jstr-1,jend+1
385 DO i=istru-1,iend+1
386 cff=0.5_r8*(pm(i-1,j)+pm(i,j))
387#ifdef MASKING
388 cff=cff*umask(i,j)
389#endif
390 ufx(i,j)=cff*(z_r(i ,j,kk+1)- &
391 & z_r(i-1,j,kk+1))
392 END DO
393 END DO
394 DO j=jstrv-1,jend+1
395 DO i=istr-1,iend+1
396 cff=0.5_r8*(pn(i,j-1)+pn(i,j))
397#ifdef MASKING
398 cff=cff*vmask(i,j)
399#endif
400 vfe(i,j)=cff*(z_r(i,j ,kk+1)- &
401 & z_r(i,j-1,kk+1))
402 END DO
403 END DO
404
405 DO j=jstr,jend+1
406 DO i=istr,iend+1
407 dzdx_p(i,j,k2b)=0.5_r8*(ufx(i,j-1)+ &
408 & ufx(i,j ))
409 dzde_p(i,j,k2b)=0.5_r8*(vfe(i-1,j)+ &
410 & vfe(i ,j))
411 END DO
412 END DO
413 DO j=jstrv-1,jend
414 DO i=istru-1,iend
415 dzdx_r(i,j,k2b)=0.5_r8*(ufx(i ,j)+ &
416 & ufx(i+1,j))
417 dzde_r(i,j,k2b)=0.5_r8*(vfe(i,j )+ &
418 & vfe(i,j+1))
419 END DO
420 END DO
421
422 IF (kk.eq.0) THEN
423 DO j=jstr,jend+1
424 DO i=istr,iend+1
425 dzdx_p(i,j,k1b)=0.0_r8
426 dzde_p(i,j,k1b)=0.0_r8
427 END DO
428 END DO
429 DO j=jstrv-1,jend
430 DO i=istru-1,iend
431 dzdx_r(i,j,k1b)=0.0_r8
432 dzde_r(i,j,k1b)=0.0_r8
433 END DO
434 END DO
435 END IF
436
437
438
439 DO j=jstrv-1,jend
440 DO i=istru-1,iend
441 cff=0.5_r8*pm(i,j)
442#ifdef MASKING
443 cff=cff*rmask(i,j)
444#endif
445 dnudx(i,j,k2b)=cff*((pn(i ,j)+pn(i+1,j))* &
446 & u(i+1,j,kk+1,nrhs)- &
447 & (pn(i-1,j)+pn(i ,j))* &
448 & u(i ,j,kk+1,nrhs))
449 END DO
450 END DO
451
452 DO j=jstr,jend+1
453 DO i=istr,iend+1
454 cff=0.125_r8*(pn(i-1,j )+pn(i,j )+ &
455 & pn(i-1,j-1)+pn(i,j-1))
456#ifdef MASKING
457 cff=cff*pmask(i,j)
458#endif
459 dmude(i,j,k2b)=cff*((pm(i-1,j )+pm(i,j ))* &
460 & u(i,j ,kk+1,nrhs)- &
461 & (pm(i-1,j-1)+pm(i,j-1))* &
462 & u(i,j-1,kk+1,nrhs))
463 END DO
464 END DO
465
466 DO j=jstr,jend+1
467 DO i=istr,iend+1
468 cff=0.125_r8*(pm(i-1,j )+pm(i,j )+ &
469 & pm(i-1,j-1)+pm(i,j-1))
470#ifdef MASKING
471 cff=cff*pmask(i,j)
472#endif
473 dnvdx(i,j,k2b)=cff*((pn(i ,j-1)+pn(i ,j))* &
474 & v(i ,j,kk+1,nrhs)- &
475 & (pn(i-1,j-1)+pn(i-1,j))* &
476 & v(i-1,j,kk+1,nrhs))
477 END DO
478 END DO
479
480 DO j=jstrv-1,jend
481 DO i=istru-1,iend
482 cff=0.5_r8*pn(i,j)
483#ifdef MASKING
484 cff=cff*rmask(i,j)
485#endif
486 dmvde(i,j,k2b)=cff*((pm(i,j )+pm(i,j+1))* &
487 & v(i,j+1,kk+1,nrhs)- &
488 & (pm(i,j-1)+pm(i,j ))* &
489 & v(i,j ,kk+1,nrhs))
490 END DO
491 END DO
492
493 IF (kk.eq.0) THEN
494 DO j=jstrv-1,jend
495 DO i=istru-1,iend
496 dnudx(i,j,k1b)=0.0_r8
497 END DO
498 END DO
499 DO j=jstr,jend+1
500 DO i=istr,iend+1
501 dmude(i,j,k1b)=0.0_r8
502 END DO
503 END DO
504 DO j=jstr,jend+1
505 DO i=istr,iend+1
506 dnvdx(i,j,k1b)=0.0_r8
507 END DO
508 END DO
509 DO j=jstrv-1,jend
510 DO i=istru-1,iend
511 dmvde(i,j,k1b)=0.0_r8
512 END DO
513 END DO
514 END IF
515 END IF
516
517 IF ((kk.eq.0).or.(kk.eq.
n(ng)))
THEN
518 DO j=jstr-1,jend+1
519 DO i=istru-1,iend+1
520 dudz(i,j,k2b)=0.0_r8
521 END DO
522 END DO
523 DO j=jstrv-1,jend+1
524 DO i=istr-1,iend+1
525 dvdz(i,j,k2b)=0.0_r8
526 END DO
527 END DO
528 IF (kk.eq.0) THEN
529 DO j=jstr-1,jend+1
530 DO i=istru-1,iend+1
531 dudz(i,j,k1b)=0.0_r8
532 END DO
533 END DO
534 DO j=jstrv-1,jend+1
535 DO i=istr-1,iend+1
536 dvdz(i,j,k1b)=0.0_r8
537 END DO
538 END DO
539 END IF
540 ELSE
541 DO j=jstr-1,jend+1
542 DO i=istru-1,iend+1
543 cff=1.0_r8/(0.5_r8*(z_r(i-1,j,kk+1)- &
544 & z_r(i-1,j,kk )+ &
545 & z_r(i ,j,kk+1)- &
546 & z_r(i ,j,kk )))
547 dudz(i,j,k2b)=cff*(u(i,j,kk+1,nrhs)- &
548 & u(i,j,kk ,nrhs))
549 END DO
550 END DO
551
552 DO j=jstrv-1,jend+1
553 DO i=istr-1,iend+1
554 cff=1.0_r8/(0.5_r8*(z_r(i,j-1,kk+1)- &
555 & z_r(i,j-1,kk )+ &
556 & z_r(i,j ,kk+1)- &
557 & z_r(i,j ,kk )))
558 dvdz(i,j,k2b)=cff*(v(i,j,kk+1,nrhs)- &
559 & v(i,j,kk ,nrhs))
560 END DO
561 END DO
562 END IF
563 END DO
564
565
566
567
568
569 above_bottom : IF (k.gt.0) THEN
570 DO j=jstrv,jend
571 DO i=istr,iend
572 cff=
dt(ng)*0.25_r8*(pm(i,j)+pm(i,j-1))*(pn(i,j)+pn(i,j-1))
573#ifdef DIAGNOSTICS_UV
574
575
576
577
578
579
580
581#endif
582
583
584 ad_cff5=ad_cff5+ad_v(i,j,k,nnew)
585 ad_cff6=ad_cff6+ad_v(i,j,k,nnew)
586
587
588
589 ad_cff1=ad_cff1+ad_rvfrc(i,j)
590 ad_cff2=ad_cff2-ad_rvfrc(i,j)
591 ad_cff3=ad_cff3+ad_rvfrc(i,j)
592 ad_cff4=ad_cff4+ad_rvfrc(i,j)
593
594
596 ad_cff3=ad_cff3+adfac
597 ad_cff4=ad_cff4+adfac
598 ad_cff6=0.0_r8
599
600
601 adfac=cff*ad_cff5
602 ad_cff1=ad_cff1+adfac
603 ad_cff2=ad_cff2-adfac
604 ad_cff5=0.0_r8
605
606
607 ad_vfse(i,j,k1)=ad_vfse(i,j,k1)-ad_cff4
608 ad_vfse(i,j,k2)=ad_vfse(i,j,k2)+ad_cff4
609 ad_cff4=0.0_r8
610
611
612 ad_vfsx(i,j,k1)=ad_vfsx(i,j,k1)-ad_cff3
613 ad_vfsx(i,j,k2)=ad_vfsx(i,j,k2)+ad_cff3
614 ad_cff3=0.0_r8
615
616
617
618 adfac=0.5_r8*(pm(i,j-1)+pm(i,j))*ad_cff2
619 ad_vfe(i,j-1)=ad_vfe(i,j-1)-adfac
620 ad_vfe(i,j )=ad_vfe(i,j )+adfac
621 ad_cff2=0.0_r8
622
623
624
625 adfac=0.5_r8*(pn(i,j-1)+pn(i,j))*ad_cff1
626 ad_vfx(i ,j)=ad_vfx(i ,j)-adfac
627 ad_vfx(i+1,j)=ad_vfx(i+1,j)+adfac
628 ad_cff1=0.0_r8
629 END DO
630 END DO
631
632 DO j=jstr,jend
633 DO i=istru,iend
634 cff=
dt(ng)*0.25_r8*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))
635#ifdef DIAGNOSTICS_UV
636
637
638
639
640
641
642
643#endif
644
645
646 ad_cff5=ad_cff5+ad_u(i,j,k,nnew)
647 ad_cff6=ad_cff6+ad_u(i,j,k,nnew)
648
649
650
651 ad_cff1=ad_cff1+ad_rufrc(i,j)
652 ad_cff2=ad_cff2+ad_rufrc(i,j)
653 ad_cff3=ad_cff3+ad_rufrc(i,j)
654 ad_cff4=ad_cff4+ad_rufrc(i,j)
655
656
658 ad_cff3=ad_cff3+adfac
659 ad_cff4=ad_cff4+adfac
660 ad_cff6=0.0_r8
661
662
663 adfac=cff*ad_cff5
664 ad_cff1=ad_cff1+adfac
665 ad_cff2=ad_cff2+adfac
666 ad_cff5=0.0_r8
667
668
669 ad_ufse(i,j,k1)=ad_ufse(i,j,k1)-ad_cff4
670 ad_ufse(i,j,k2)=ad_ufse(i,j,k2)+ad_cff4
671 ad_cff4=0.0_r8
672
673
674 ad_ufsx(i,j,k1)=ad_ufsx(i,j,k1)-ad_cff3
675 ad_ufsx(i,j,k2)=ad_ufsx(i,j,k2)+ad_cff3
676 ad_cff3=0.0_r8
677
678
679
680 adfac=0.5_r8*(pm(i-1,j)+pm(i,j))*ad_cff2
681 ad_ufe(i,j )=ad_ufe(i,j )-adfac
682 ad_ufe(i,j+1)=ad_ufe(i,j+1)+adfac
683 ad_cff2=0.0_r8
684
685
686
687 adfac=0.5_r8*(pn(i-1,j)+pn(i,j))*ad_cff1
688 ad_ufx(i-1,j)=ad_ufx(i-1,j)-adfac
689 ad_ufx(i ,j)=ad_ufx(i ,j)+adfac
690 ad_cff1=0.0_r8
691 END DO
692 END DO
693
694
695
696
697 below_surface :
IF (k.lt.
n(ng))
THEN
698 DO j=jstrv,jend
699 DO i=istr,iend
700#ifdef VISC_3DCOEF
701 cff=0.125_r8* &
702 & (visc3d_r(i,j-1,k )+visc3d_r(i,j,k )+ &
703 & visc3d_r(i,j-1,k+1)+visc3d_r(i,j,k+1))
704 fac1=cff*on_v(i,j)
705 fac2=cff*om_v(i,j)
706#else
707 cff=0.25_r8*(visc2_r(i,j-1)+visc2_r(i,j))
708 fac1=cff*on_v(i,j)
709 fac2=cff*om_v(i,j)
710#endif
711 cff=0.5_r8*(pn(i,j-1)+pn(i,j))
712 dnudz=cff*0.25_r8*(dudz(i ,j ,k2)+ &
713 & dudz(i+1,j ,k2)+ &
714 & dudz(i ,j-1,k2)+ &
715 & dudz(i+1,j-1,k2))
716 dnvdz=cff*dvdz(i,j,k2)
717 cff=0.5_r8*(pm(i,j-1)+pm(i,j))
718 dmudz=cff*0.25_r8*(dudz(i ,j ,k2)+ &
719 & dudz(i+1,j ,k2)+ &
720 & dudz(i ,j-1,k2)+ &
721 & dudz(i+1,j-1,k2))
722 dmvdz=cff*dvdz(i,j,k2)
723
724 cff1=min(dzdx_p(i ,j,k1),0.0_r8)
725 cff2=min(dzdx_p(i+1,j,k2),0.0_r8)
726 cff3=max(dzdx_p(i ,j,k2),0.0_r8)
727 cff4=max(dzdx_p(i+1,j,k1),0.0_r8)
728 cff5=min(dzde_p(i ,j,k1),0.0_r8)
729 cff6=min(dzde_p(i+1,j,k2),0.0_r8)
730 cff7=max(dzde_p(i ,j,k2),0.0_r8)
731 cff8=max(dzde_p(i+1,j,k1),0.0_r8)
732#ifdef VISC_3DCOEF
733
734
735
736
737
738
739
740 ad_fac2=ad_fac2+ &
741 & (cff1*(cff5*dmudz-dmude(i ,j,k1))+ &
742 & cff2*(cff6*dmudz-dmude(i+1,j,k2))+ &
743 & cff3*(cff7*dmudz-dmude(i ,j,k2))+ &
744 & cff4*(cff8*dmudz-dmude(i+1,j,k1)))* &
745 & ad_vfse(i,j,k2)
746#endif
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762 adfac=fac2*ad_vfse(i,j,k2)
763 adfac1=adfac*dmudz
764 ad_cff1=ad_cff1+(cff5*dmudz-dmude(i ,j,k1))*adfac
765 ad_cff2=ad_cff2+(cff6*dmudz-dmude(i+1,j,k2))*adfac
766 ad_cff3=ad_cff3+(cff7*dmudz-dmude(i ,j,k2))*adfac
767 ad_cff4=ad_cff4+(cff8*dmudz-dmude(i+1,j,k1))*adfac
768 ad_cff5=ad_cff5+cff1*adfac1
769 ad_cff6=ad_cff6+cff2*adfac1
770 ad_cff7=ad_cff7+cff3*adfac1
771 ad_cff8=ad_cff8+cff4*adfac1
772 ad_dmudz=ad_dmudz+ &
773 & (cff1*cff5+cff2*cff6+cff3*cff7+cff4*cff8)* &
774 & adfac
775 ad_dmude(i ,j,k1)=ad_dmude(i ,j,k1)-cff1*adfac
776 ad_dmude(i+1,j,k2)=ad_dmude(i+1,j,k2)-cff2*adfac
777 ad_dmude(i ,j,k2)=ad_dmude(i ,j,k2)-cff3*adfac
778 ad_dmude(i+1,j,k1)=ad_dmude(i+1,j,k1)-cff4*adfac
779
780
781
782 ad_dzde_p(i+1,j,k1)=ad_dzde_p(i+1,j,k1)+ &
783 & (0.5_r8+ &
784 & sign(0.5_r8, dzde_p(i+1,j,k1)))* &
785 & ad_cff8
786 ad_cff8=0.0_r8
787
788
789
790 ad_dzde_p(i ,j,k2)=ad_dzde_p(i ,j,k2)+ &
791 & (0.5_r8+ &
792 & sign(0.5_r8, dzde_p(i ,j,k2)))* &
793 & ad_cff7
794 ad_cff7=0.0_r8
795
796
797
798 ad_dzde_p(i+1,j,k2)=ad_dzde_p(i+1,j,k2)+ &
799 & (0.5_r8+ &
800 & sign(0.5_r8,-dzde_p(i+1,j,k2)))* &
801 & ad_cff6
802 ad_cff6=0.0_r8
803
804
805
806 ad_dzde_p(i ,j,k1)=ad_dzde_p(i ,j,k1)+ &
807 & (0.5_r8+ &
808 & sign(0.5_r8,-dzde_p(i ,j,k1)))* &
809 & ad_cff5
810 ad_cff5=0.0_r8
811
812
813
814 ad_dzdx_p(i+1,j,k1)=ad_dzdx_p(i+1,j,k1)+ &
815 & (0.5_r8+ &
816 & sign(0.5_r8, dzdx_p(i+1,j,k1)))* &
817 & ad_cff4
818 ad_cff4=0.0_r8
819
820
821
822 ad_dzdx_p(i ,j,k2)=ad_dzdx_p(i ,j,k2)+ &
823 & (0.5_r8+ &
824 & sign(0.5_r8, dzdx_p(i ,j,k2)))* &
825 & ad_cff3
826 ad_cff3=0.0_r8
827
828
829
830 ad_dzdx_p(i+1,j,k2)=ad_dzdx_p(i+1,j,k2)+ &
831 & (0.5_r8+ &
832 & sign(0.5_r8,-dzdx_p(i+1,j,k2)))* &
833 & ad_cff2
834 ad_cff2=0.0_r8
835
836
837
838 ad_dzdx_p(i ,j,k1)=ad_dzdx_p(i ,j,k1)+ &
839 & (0.5_r8+ &
840 & sign(0.5_r8,-dzdx_p(i ,j,k1)))* &
841 & ad_cff1
842 ad_cff1=0.0_r8
843
844 cff1=min(dzde_r(i,j-1,k1),0.0_r8)
845 cff2=min(dzde_r(i,j ,k2),0.0_r8)
846 cff3=max(dzde_r(i,j-1,k2),0.0_r8)
847 cff4=max(dzde_r(i,j ,k1),0.0_r8)
848 cff5=min(dzdx_r(i,j-1,k1),0.0_r8)
849 cff6=min(dzdx_r(i,j ,k2),0.0_r8)
850 cff7=max(dzdx_r(i,j-1,k2),0.0_r8)
851 cff8=max(dzdx_r(i,j ,k1),0.0_r8)
852#ifdef VISC_3DCOEF
853
854
855
856
857
858
859
860 ad_fac1=ad_fac1- &
861 & (cff1*(cff5*dnudz-dnudx(i,j-1,k1))+ &
862 & cff2*(cff6*dnudz-dnudx(i,j ,k2))+ &
863 & cff3*(cff7*dnudz-dnudx(i,j-1,k2))+ &
864 & cff4*(cff8*dnudz-dnudx(i,j ,k1)))* &
865 & ad_vfsx(i,j,k2)
866#endif
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882 adfac=fac1*ad_vfsx(i,j,k2)
883 adfac1=adfac*dnudz
884 ad_cff1=ad_cff1-(cff5*dnudz-dnudx(i,j-1,k1))*adfac
885 ad_cff2=ad_cff2-(cff6*dnudz-dnudx(i,j ,k2))*adfac
886 ad_cff3=ad_cff3-(cff7*dnudz-dnudx(i,j-1,k2))*adfac
887 ad_cff4=ad_cff4-(cff8*dnudz-dnudx(i,j ,k1))*adfac
888 ad_cff5=ad_cff5-cff1*adfac1
889 ad_cff6=ad_cff6-cff2*adfac1
890 ad_cff7=ad_cff7-cff3*adfac1
891 ad_cff8=ad_cff8-cff4*adfac1
892 ad_dnudz=ad_dnudz- &
893 & (cff1*cff5+cff2*cff6+cff3*cff7+cff4*cff8)* &
894 & adfac
895 ad_dnudx(i,j-1,k1)=ad_dnudx(i,j-1,k1)+cff1*adfac
896 ad_dnudx(i,j ,k2)=ad_dnudx(i,j ,k2)+cff2*adfac
897 ad_dnudx(i,j-1,k2)=ad_dnudx(i,j-1,k2)+cff3*adfac
898 ad_dnudx(i,j ,k1)=ad_dnudx(i,j ,k1)+cff4*adfac
899
900
901
902 ad_dzdx_r(i,j ,k1)=ad_dzdx_r(i,j ,k1)+ &
903 & (0.5_r8+ &
904 & sign(0.5_r8, dzdx_r(i,j ,k1)))* &
905 & ad_cff8
906 ad_cff8=0.0_r8
907
908
909
910 ad_dzdx_r(i,j-1,k2)=ad_dzdx_r(i,j-1,k2)+ &
911 & (0.5_r8+ &
912 & sign(0.5_r8, dzdx_r(i,j-1,k2)))* &
913 & ad_cff7
914 ad_cff7=0.0_r8
915
916
917
918 ad_dzdx_r(i,j ,k2)=ad_dzdx_r(i,j ,k2)+ &
919 & (0.5_r8+ &
920 & sign(0.5_r8,-dzdx_r(i,j ,k2)))* &
921 & ad_cff6
922 ad_cff6=0.0_r8
923
924
925
926 ad_dzdx_r(i,j-1,k1)=ad_dzdx_r(i,j-1,k1)+ &
927 & (0.5_r8+ &
928 & sign(0.5_r8,-dzdx_r(i,j-1,k1)))* &
929 & ad_cff5
930 ad_cff5=0.0_r8
931
932
933
934 ad_dzde_r(i,j ,k1)=ad_dzde_r(i,j ,k1)+ &
935 & (0.5_r8+ &
936 & sign(0.5_r8, dzde_r(i,j ,k1)))* &
937 & ad_cff4
938 ad_cff4=0.0_r8
939
940
941
942 ad_dzde_r(i,j-1,k2)=ad_dzde_r(i,j-1,k2)+ &
943 & (0.5_r8+ &
944 & sign(0.5_r8, dzde_r(i,j-1,k2)))* &
945 & ad_cff3
946 ad_cff3=0.0_r8
947
948
949
950 ad_dzde_r(i,j ,k2)=ad_dzde_r(i,j ,k2)+ &
951 & (0.5_r8+ &
952 & sign(0.5_r8,-dzde_r(i,j ,k2)))* &
953 & ad_cff2
954 ad_cff2=0.0_r8
955
956
957
958 ad_dzde_r(i,j-1,k1)=ad_dzde_r(i,j-1,k1)+ &
959 & (0.5_r8+ &
960 & sign(0.5_r8,-dzde_r(i,j-1,k1)))* &
961 & ad_cff1
962 ad_cff1=0.0_r8
963
964 cff1=min(dzde_r(i,j-1,k1),0.0_r8)
965 cff2=min(dzde_r(i,j ,k2),0.0_r8)
966 cff3=max(dzde_r(i,j-1,k2),0.0_r8)
967 cff4=max(dzde_r(i,j ,k1),0.0_r8)
968#ifdef VISC_3DCOEF
969
970
971
972
973
974
975
976 ad_fac2=ad_fac2+ &
977 & (cff1*(cff1*dmvdz-dmvde(i,j-1,k1))+ &
978 & cff2*(cff2*dmvdz-dmvde(i,j ,k2))+ &
979 & cff3*(cff3*dmvdz-dmvde(i,j-1,k2))+ &
980 & cff4*(cff4*dmvdz-dmvde(i,j ,k1)))* &
981 & ad_vfse(i,j,k2)
982#endif
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997 cff=2.0_r8*dmvdz
998 adfac=fac2*ad_vfse(i,j,k2)
999 ad_cff1=ad_cff1+(cff1*cff-dmvde(i,j-1,k1))*adfac
1000 ad_cff2=ad_cff2+(cff2*cff-dmvde(i,j ,k2))*adfac
1001 ad_cff3=ad_cff3+(cff3*cff-dmvde(i,j-1,k2))*adfac
1002 ad_cff4=ad_cff4+(cff4*cff-dmvde(i,j ,k1))*adfac
1003 ad_dmvdz=ad_dmvdz+ &
1004 & (cff1*cff1+cff2*cff2+cff3*cff3+cff4*cff4)* &
1005 & adfac
1006 ad_dmvde(i,j-1,k1)=ad_dmvde(i,j-1,k1)-cff1*adfac
1007 ad_dmvde(i,j ,k2)=ad_dmvde(i,j ,k2)-cff2*adfac
1008 ad_dmvde(i,j-1,k2)=ad_dmvde(i,j-1,k2)-cff3*adfac
1009 ad_dmvde(i,j ,k1)=ad_dmvde(i,j ,k1)-cff4*adfac
1010 ad_vfse(i,j,k2)=0.0_r8
1011
1012
1013
1014 ad_dzde_r(i,j ,k1)=ad_dzde_r(i,j ,k1)+ &
1015 & (0.5_r8+ &
1016 & sign(0.5_r8, dzde_r(i,j ,k1)))* &
1017 & ad_cff4
1018 ad_cff4=0.0_r8
1019
1020
1021
1022 ad_dzde_r(i,j-1,k2)=ad_dzde_r(i,j-1,k2)+ &
1023 & (0.5_r8+ &
1024 & sign(0.5_r8, dzde_r(i,j-1,k2)))* &
1025 & ad_cff3
1026 ad_cff3=0.0_r8
1027
1028
1029
1030 ad_dzde_r(i,j ,k2)=ad_dzde_r(i,j ,k2)+ &
1031 & (0.5_r8+ &
1032 & sign(0.5_r8,-dzde_r(i,j ,k2)))* &
1033 & ad_cff2
1034 ad_cff2=0.0_r8
1035
1036
1037
1038 ad_dzde_r(i,j-1,k1)=ad_dzde_r(i,j-1,k1)+ &
1039 & (0.5_r8+ &
1040 & sign(0.5_r8,-dzde_r(i,j-1,k1)))* &
1041 & ad_cff1
1042 ad_cff1=0.0_r8
1043
1044 cff1=min(dzdx_p(i ,j,k1),0.0_r8)
1045 cff2=min(dzdx_p(i+1,j,k2),0.0_r8)
1046 cff3=max(dzdx_p(i ,j,k2),0.0_r8)
1047 cff4=max(dzdx_p(i+1,j,k1),0.0_r8)
1048#ifdef VISC_3DCOEF
1049
1050
1051
1052
1053
1054
1055
1056 ad_fac1=ad_fac1+ &
1057 & (cff1*(cff1*dnvdz-dnvdx(i ,j,k1))+ &
1058 & cff2*(cff2*dnvdz-dnvdx(i+1,j,k2))+ &
1059 & cff3*(cff3*dnvdz-dnvdx(i ,j,k2))+ &
1060 & cff4*(cff4*dnvdz-dnvdx(i+1,j,k1)))* &
1061 & ad_vfsx(i,j,k2)
1062#endif
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077 cff=2.0_r8*dnvdz
1078 adfac=fac1*ad_vfsx(i,j,k2)
1079 ad_cff1=ad_cff1+(cff1*cff-dnvdx(i ,j,k1))*adfac
1080 ad_cff2=ad_cff2+(cff2*cff-dnvdx(i+1,j,k2))*adfac
1081 ad_cff3=ad_cff3+(cff3*cff-dnvdx(i ,j,k2))*adfac
1082 ad_cff4=ad_cff4+(cff4*cff-dnvdx(i+1,j,k1))*adfac
1083 ad_dnvdz=ad_dnvdz+ &
1084 & (cff1*cff1+cff2*cff2+cff3*cff3+cff4*cff4)* &
1085 & adfac
1086 ad_dnvdx(i ,j,k1)=ad_dnvdx(i ,j,k1)-cff1*adfac
1087 ad_dnvdx(i+1,j,k2)=ad_dnvdx(i+1,j,k2)-cff2*adfac
1088 ad_dnvdx(i ,j,k2)=ad_dnvdx(i ,j,k2)-cff3*adfac
1089 ad_dnvdx(i+1,j,k1)=ad_dnvdx(i+1,j,k1)-cff4*adfac
1090 ad_vfsx(i,j,k2)=0.0_r8
1091
1092
1093
1094 ad_dzdx_p(i+1,j,k1)=ad_dzdx_p(i+1,j,k1)+ &
1095 & (0.5_r8+ &
1096 & sign(0.5_r8, dzdx_p(i+1,j,k1)))* &
1097 & ad_cff4
1098 ad_cff4=0.0_r8
1099
1100
1101
1102 ad_dzdx_p(i ,j,k2)=ad_dzdx_p(i ,j,k2)+ &
1103 & (0.5_r8+ &
1104 & sign(0.5_r8, dzdx_p(i ,j,k2)))* &
1105 & ad_cff3
1106 ad_cff3=0.0_r8
1107
1108
1109
1110 ad_dzdx_p(i+1,j,k2)=ad_dzdx_p(i+1,j,k2)+ &
1111 & (0.5_r8+ &
1112 & sign(0.5_r8,-dzdx_p(i+1,j,k2)))* &
1113 & ad_cff2
1114 ad_cff2=0.0_r8
1115
1116
1117
1118 ad_dzdx_p(i ,j,k1)=ad_dzdx_p(i ,j,k1)+ &
1119 & (0.5_r8+ &
1120 & sign(0.5_r8,-dzdx_p(i ,j,k1)))* &
1121 & ad_cff1
1122 ad_cff1=0.0_r8
1123
1124 cff=0.5_r8*(pm(i,j-1)+pm(i,j))
1125
1126
1127 ad_dvdz(i,j,k2)=ad_dvdz(i,j,k2)+cff*ad_dmvdz
1128 ad_dmvdz=0.0_r8
1129
1130
1131
1132
1133
1134 adfac=cff*0.25_r8*ad_dmudz
1135 ad_dudz(i ,j-1,k2)=ad_dudz(i ,j-1,k2)+adfac
1136 ad_dudz(i+1,j-1,k2)=ad_dudz(i+1,j-1,k2)+adfac
1137 ad_dudz(i ,j ,k2)=ad_dudz(i ,j ,k2)+adfac
1138 ad_dudz(i+1,j ,k2)=ad_dudz(i+1,j ,k2)+adfac
1139 ad_dmudz=0.0_r8
1140
1141 cff=0.5_r8*(pn(i,j-1)+pn(i,j))
1142
1143
1144 ad_dvdz(i,j,k2)=ad_dvdz(i,j,k2)+cff*ad_dnvdz
1145 ad_dnvdz=0.0_r8
1146
1147
1148
1149
1150
1151 adfac=cff*0.25_r8*ad_dnudz
1152 ad_dudz(i ,j-1,k2)=ad_dudz(i ,j-1,k2)+adfac
1153 ad_dudz(i+1,j-1,k2)=ad_dudz(i+1,j-1,k2)+adfac
1154 ad_dudz(i ,j ,k2)=ad_dudz(i ,j ,k2)+adfac
1155 ad_dudz(i+1,j ,k2)=ad_dudz(i+1,j ,k2)+adfac
1156 ad_dnudz=0.0_r8
1157#ifdef VISC_3DCOEF
1158
1159
1160
1161 ad_cff=ad_cff+ &
1162 & on_v(i,j)*ad_fac1+om_v(i,j)*ad_fac2
1163 ad_fac1=0.0_r8
1164 ad_fac2=0.0_r8
1165
1166
1167
1168
1169 adfac=0.125_r8*ad_cff
1170 ad_visc3d_r(i,j-1,k )=ad_visc3d_r(i,j-1,k )+adfac
1171 ad_visc3d_r(i,j ,k )=ad_visc3d_r(i,j ,k )+adfac
1172 ad_visc3d_r(i,j-1,k+1)=ad_visc3d_r(i,j-1,k+1)+adfac
1173 ad_visc3d_r(i,j ,k+1)=ad_visc3d_r(i,j ,k+1)+adfac
1174 ad_cff=0.0_r8
1175#endif
1176 END DO
1177 END DO
1178
1179 DO j=jstr,jend
1180 DO i=istru,iend
1181#ifdef VISC_3DCOEF
1182 cff=0.125_r8* &
1183 & (visc3d_r(i-1,j,k )+visc3d_r(i,j,k )+ &
1184 & visc3d_r(i-1,j,k+1)+visc3d_r(i,j,k+1))
1185 fac1=cff*on_u(i,j)
1186 fac2=cff*om_u(i,j)
1187#else
1188 cff=0.25_r8*(visc2_r(i-1,j)+visc2_r(i,j))
1189 fac1=cff*on_u(i,j)
1190 fac2=cff*om_u(i,j)
1191#endif
1192 cff=0.5_r8*(pn(i-1,j)+pn(i,j))
1193 dnudz=cff*dudz(i,j,k2)
1194 dnvdz=cff*0.25_r8*(dvdz(i-1,j+1,k2)+ &
1195 & dvdz(i ,j+1,k2)+ &
1196 & dvdz(i-1,j ,k2)+ &
1197 & dvdz(i ,j ,k2))
1198 cff=0.5_r8*(pm(i-1,j)+pm(i,j))
1199 dmudz=cff*dudz(i,j,k2)
1200 dmvdz=cff*0.25_r8*(dvdz(i-1,j+1,k2)+ &
1201 & dvdz(i ,j+1,k2)+ &
1202 & dvdz(i-1,j ,k2)+ &
1203 & dvdz(i ,j ,k2))
1204
1205 cff1=min(dzdx_r(i-1,j,k1),0.0_r8)
1206 cff2=min(dzdx_r(i ,j,k2),0.0_r8)
1207 cff3=max(dzdx_r(i-1,j,k2),0.0_r8)
1208 cff4=max(dzdx_r(i ,j,k1),0.0_r8)
1209 cff5=min(dzde_r(i-1,j,k1),0.0_r8)
1210 cff6=min(dzde_r(i ,j,k2),0.0_r8)
1211 cff7=max(dzde_r(i-1,j,k2),0.0_r8)
1212 cff8=max(dzde_r(i ,j,k1),0.0_r8)
1213#ifdef VISC_3DCOEF
1214
1215
1216
1217
1218
1219
1220
1221 ad_fac2=ad_fac2- &
1222 & (cff1*(cff5*dmvdz-dmvde(i-1,j,k1))+ &
1223 & cff2*(cff6*dmvdz-dmvde(i ,j,k2))+ &
1224 & cff3*(cff7*dmvdz-dmvde(i-1,j,k2))+ &
1225 & cff4*(cff8*dmvdz-dmvde(i ,j,k1)))* &
1226 & ad_ufse(i,j,k2)
1227#endif
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243 adfac=fac2*ad_ufse(i,j,k2)
1244 adfac1=adfac*dmvdz
1245 ad_cff1=ad_cff1-(cff5*dmvdz-dmvde(i-1,j,k1))*adfac
1246 ad_cff2=ad_cff2-(cff6*dmvdz-dmvde(i ,j,k2))*adfac
1247 ad_cff3=ad_cff3-(cff7*dmvdz-dmvde(i-1,j,k2))*adfac
1248 ad_cff4=ad_cff4-(cff8*dmvdz-dmvde(i ,j,k1))*adfac
1249 ad_cff5=ad_cff5-cff1*adfac1
1250 ad_cff6=ad_cff6-cff2*adfac1
1251 ad_cff7=ad_cff7-cff3*adfac1
1252 ad_cff8=ad_cff8-cff4*adfac1
1253 ad_dmvdz=ad_dmvdz- &
1254 & (cff1*cff5+cff2*cff6+cff3*cff7+cff4*cff8)* &
1255 & adfac
1256 ad_dmvde(i-1,j,k1)=ad_dmvde(i-1,j,k1)+cff1*adfac
1257 ad_dmvde(i ,j,k2)=ad_dmvde(i ,j,k2)+cff2*adfac
1258 ad_dmvde(i-1,j,k2)=ad_dmvde(i-1,j,k2)+cff3*adfac
1259 ad_dmvde(i ,j,k1)=ad_dmvde(i ,j,k1)+cff4*adfac
1260
1261
1262
1263 ad_dzde_r(i ,j,k1)=ad_dzde_r(i ,j,k1)+ &
1264 & (0.5_r8+ &
1265 & sign(0.5_r8, dzde_r(i ,j,k1)))* &
1266 & ad_cff8
1267 ad_cff8=0.0_r8
1268
1269
1270
1271 ad_dzde_r(i-1,j,k2)=ad_dzde_r(i-1,j,k2)+ &
1272 & (0.5_r8+ &
1273 & sign(0.5_r8, dzde_r(i-1,j,k2)))* &
1274 & ad_cff7
1275 ad_cff7=0.0_r8
1276
1277
1278
1279 ad_dzde_r(i ,j,k2)=ad_dzde_r(i ,j,k2)+ &
1280 & (0.5_r8+ &
1281 & sign(0.5_r8,-dzde_r(i ,j,k2)))* &
1282 & ad_cff6
1283 ad_cff6=0.0_r8
1284
1285
1286
1287 ad_dzde_r(i-1,j,k1)=ad_dzde_r(i-1,j,k1)+ &
1288 & (0.5_r8+ &
1289 & sign(0.5_r8,-dzde_r(i-1,j,k1)))* &
1290 & ad_cff5
1291 ad_cff5=0.0_r8
1292
1293
1294
1295 ad_dzdx_r(i ,j,k1)=ad_dzdx_r(i ,j,k1)+ &
1296 & (0.5_r8+ &
1297 & sign(0.5_r8, dzdx_r(i ,j,k1)))* &
1298 & ad_cff4
1299 ad_cff4=0.0_r8
1300
1301
1302
1303 ad_dzdx_r(i-1,j,k2)=ad_dzdx_r(i-1,j,k2)+ &
1304 & (0.5_r8+ &
1305 & sign(0.5_r8, dzdx_r(i-1,j,k2)))* &
1306 & ad_cff3
1307 ad_cff3=0.0_r8
1308
1309
1310
1311 ad_dzdx_r(i ,j,k2)=ad_dzdx_r(i ,j,k2)+ &
1312 & (0.5_r8+ &
1313 & sign(0.5_r8,-dzdx_r(i ,j,k2)))* &
1314 & ad_cff2
1315 ad_cff2=0.0_r8
1316
1317
1318
1319 ad_dzdx_r(i-1,j,k1)=ad_dzdx_r(i-1,j,k1)+ &
1320 & (0.5_r8+ &
1321 & sign(0.5_r8,-dzdx_r(i-1,j,k1)))* &
1322 & ad_cff1
1323 ad_cff1=0.0_r8
1324
1325 cff1=min(dzde_p(i,j ,k1),0.0_r8)
1326 cff2=min(dzde_p(i,j+1,k2),0.0_r8)
1327 cff3=max(dzde_p(i,j ,k2),0.0_r8)
1328 cff4=max(dzde_p(i,j+1,k1),0.0_r8)
1329 cff5=min(dzdx_p(i,j ,k1),0.0_r8)
1330 cff6=min(dzdx_p(i,j+1,k2),0.0_r8)
1331 cff7=max(dzdx_p(i,j ,k2),0.0_r8)
1332 cff8=max(dzdx_p(i,j+1,k1),0.0_r8)
1333#ifdef VISC_3DCOEF
1334
1335
1336
1337
1338
1339
1340
1341 ad_fac1=ad_fac1+ &
1342 & (cff1*(cff5*dnvdz-dnvdx(i,j ,k1))+ &
1343 & cff2*(cff6*dnvdz-dnvdx(i,j+1,k2))+ &
1344 & cff3*(cff7*dnvdz-dnvdx(i,j ,k2))+ &
1345 & cff4*(cff8*dnvdz-dnvdx(i,j+1,k1)))* &
1346 & ad_ufsx(i,j,k2)
1347#endif
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363 adfac=fac1*ad_ufsx(i,j,k2)
1364 adfac1=adfac*dnvdz
1365 ad_cff1=ad_cff1+(cff5*dnvdz-dnvdx(i,j ,k1))*adfac
1366 ad_cff2=ad_cff2+(cff6*dnvdz-dnvdx(i,j+1,k2))*adfac
1367 ad_cff3=ad_cff3+(cff7*dnvdz-dnvdx(i,j ,k2))*adfac
1368 ad_cff4=ad_cff4+(cff8*dnvdz-dnvdx(i,j+1,k1))*adfac
1369 ad_cff5=ad_cff5+cff1*adfac1
1370 ad_cff6=ad_cff6+cff2*adfac1
1371 ad_cff7=ad_cff7+cff3*adfac1
1372 ad_cff8=ad_cff8+cff4*adfac1
1373 ad_dnvdz=ad_dnvdz+ &
1374 & (cff1*cff5+cff2*cff6+cff3*cff7+cff4*cff8)* &
1375 & adfac
1376 ad_dnvdx(i,j ,k1)=ad_dnvdx(i,j ,k1)-cff1*adfac
1377 ad_dnvdx(i,j+1,k2)=ad_dnvdx(i,j+1,k2)-cff2*adfac
1378 ad_dnvdx(i,j ,k2)=ad_dnvdx(i,j ,k2)-cff3*adfac
1379 ad_dnvdx(i,j+1,k1)=ad_dnvdx(i,j+1,k1)-cff4*adfac
1380
1381
1382
1383 ad_dzdx_p(i,j+1,k1)=ad_dzdx_p(i,j+1,k1)+ &
1384 & (0.5_r8+ &
1385 & sign(0.5_r8, dzdx_p(i,j+1,k1)))* &
1386 & ad_cff8
1387 ad_cff8=0.0_r8
1388
1389
1390
1391 ad_dzdx_p(i,j ,k2)=ad_dzdx_p(i,j ,k2)+ &
1392 & (0.5_r8+ &
1393 & sign(0.5_r8, dzdx_p(i,j ,k2)))* &
1394 & ad_cff7
1395 ad_cff7=0.0_r8
1396
1397
1398
1399 ad_dzdx_p(i,j+1,k2)=ad_dzdx_p(i,j+1,k2)+ &
1400 & (0.5_r8+ &
1401 & sign(0.5_r8,-dzdx_p(i,j+1,k2)))* &
1402 & ad_cff6
1403 ad_cff6=0.0_r8
1404
1405
1406
1407 ad_dzdx_p(i,j ,k1)=ad_dzdx_p(i,j ,k1)+ &
1408 & (0.5_r8+ &
1409 & sign(0.5_r8,-dzdx_p(i,j ,k1)))* &
1410 & ad_cff5
1411 ad_cff5=0.0_r8
1412
1413
1414
1415 ad_dzde_p(i,j+1,k1)=ad_dzde_p(i,j+1,k1)+ &
1416 & (0.5_r8+ &
1417 & sign(0.5_r8, dzde_p(i,j+1,k1)))* &
1418 & ad_cff4
1419 ad_cff4=0.0_r8
1420
1421
1422
1423 ad_dzde_p(i,j ,k2)=ad_dzde_p(i,j ,k2)+ &
1424 & (0.5_r8+ &
1425 & sign(0.5_r8, dzde_p(i,j ,k2)))* &
1426 & ad_cff3
1427 ad_cff3=0.0_r8
1428
1429
1430
1431 ad_dzde_p(i,j+1,k2)=ad_dzde_p(i,j+1,k2)+ &
1432 & (0.5_r8+ &
1433 & sign(0.5_r8,-dzde_p(i,j+1,k2)))* &
1434 & ad_cff2
1435 ad_cff2=0.0_r8
1436
1437
1438
1439 ad_dzde_p(i,j ,k1)=ad_dzde_p(i,j ,k1)+ &
1440 & (0.5_r8+ &
1441 & sign(0.5_r8,-dzde_p(i,j ,k1)))* &
1442 & ad_cff1
1443 ad_cff1=0.0_r8
1444
1445 cff1=min(dzde_p(i,j ,k1),0.0_r8)
1446 cff2=min(dzde_p(i,j+1,k2),0.0_r8)
1447 cff3=max(dzde_p(i,j ,k2),0.0_r8)
1448 cff4=max(dzde_p(i,j+1,k1),0.0_r8)
1449#ifdef VISC_3DCOEF
1450
1451
1452
1453
1454
1455
1456
1457 ad_fac2=ad_fac2+ &
1458 & (cff1*(cff1*dmudz-dmude(i,j ,k1))+ &
1459 & cff2*(cff2*dmudz-dmude(i,j+1,k2))+ &
1460 & cff3*(cff3*dmudz-dmude(i,j ,k2))+ &
1461 & cff4*(cff4*dmudz-dmude(i,j+1,k1)))* &
1462 & ad_ufse(i,j,k2)
1463#endif
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478 cff=2.0_r8*dmudz
1479 adfac=fac2*ad_ufse(i,j,k2)
1480 ad_cff1=ad_cff1+(cff1*cff-dmude(i,j ,k1))*adfac
1481 ad_cff2=ad_cff2+(cff2*cff-dmude(i,j+1,k2))*adfac
1482 ad_cff3=ad_cff3+(cff3*cff-dmude(i,j ,k2))*adfac
1483 ad_cff4=ad_cff4+(cff4*cff-dmude(i,j+1,k1))*adfac
1484 ad_dmudz=ad_dmudz+ &
1485 & (cff1*cff1+cff2*cff2+cff3*cff3+cff4*cff4)* &
1486 & adfac
1487 ad_dmude(i,j ,k1)=ad_dmude(i,j ,k1)-cff1*adfac
1488 ad_dmude(i,j+1,k2)=ad_dmude(i,j+1,k2)-cff2*adfac
1489 ad_dmude(i,j ,k2)=ad_dmude(i,j ,k2)-cff3*adfac
1490 ad_dmude(i,j+1,k1)=ad_dmude(i,j+1,k1)-cff4*adfac
1491 ad_ufse(i,j,k2)=0.0_r8
1492
1493
1494
1495 ad_dzde_p(i,j+1,k1)=ad_dzde_p(i,j+1,k1)+ &
1496 & (0.5_r8+ &
1497 & sign(0.5_r8, dzde_p(i,j+1,k1)))* &
1498 & ad_cff4
1499 ad_cff4=0.0_r8
1500
1501
1502
1503 ad_dzde_p(i,j ,k2)=ad_dzde_p(i,j ,k2)+ &
1504 & (0.5_r8+ &
1505 & sign(0.5_r8, dzde_p(i,j ,k2)))* &
1506 & ad_cff3
1507 ad_cff3=0.0_r8
1508
1509
1510
1511 ad_dzde_p(i,j+1,k2)=ad_dzde_p(i,j+1,k2)+ &
1512 & (0.5_r8+ &
1513 & sign(0.5_r8,-dzde_p(i,j+1,k2)))* &
1514 & ad_cff2
1515 ad_cff2=0.0_r8
1516
1517
1518
1519 ad_dzde_p(i,j ,k1)=ad_dzde_p(i,j ,k1)+ &
1520 & (0.5_r8+ &
1521 & sign(0.5_r8,-dzde_p(i,j ,k1)))* &
1522 & ad_cff1
1523 ad_cff1=0.0_r8
1524
1525 cff1=min(dzdx_r(i-1,j,k1),0.0_r8)
1526 cff2=min(dzdx_r(i ,j,k2),0.0_r8)
1527 cff3=max(dzdx_r(i-1,j,k2),0.0_r8)
1528 cff4=max(dzdx_r(i ,j,k1),0.0_r8)
1529#ifdef VISC_3DCOEF
1530
1531
1532
1533
1534
1535
1536
1537 ad_fac1=ad_fac1+ &
1538 & (cff1*(cff1*dnudz-dnudx(i-1,j,k1))+ &
1539 & cff2*(cff2*dnudz-dnudx(i ,j,k2))+ &
1540 & cff3*(cff3*dnudz-dnudx(i-1,j,k2))+ &
1541 & cff4*(cff4*dnudz-dnudx(i ,j,k1)))* &
1542 & ad_ufsx(i,j,k2)
1543#endif
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558 cff=2.0_r8*dnudz
1559 adfac=fac1*ad_ufsx(i,j,k2)
1560 ad_cff1=ad_cff1+(cff1*cff-dnudx(i-1,j,k1))*adfac
1561 ad_cff2=ad_cff2+(cff2*cff-dnudx(i ,j,k2))*adfac
1562 ad_cff3=ad_cff3+(cff3*cff-dnudx(i-1,j,k2))*adfac
1563 ad_cff4=ad_cff4+(cff4*cff-dnudx(i ,j,k1))*adfac
1564 ad_dnudz=ad_dnudz+ &
1565 & (cff1*cff1+cff2*cff2+cff3*cff3+cff4*cff4)* &
1566 & adfac
1567 ad_dnudx(i-1,j,k1)=ad_dnudx(i-1,j,k1)-cff1*adfac
1568 ad_dnudx(i ,j,k2)=ad_dnudx(i ,j,k2)-cff2*adfac
1569 ad_dnudx(i-1,j,k2)=ad_dnudx(i-1,j,k2)-cff3*adfac
1570 ad_dnudx(i ,j,k1)=ad_dnudx(i ,j,k1)-cff4*adfac
1571 ad_ufsx(i,j,k2)=0.0_r8
1572
1573
1574
1575 ad_dzdx_r(i ,j,k1)=ad_dzdx_r(i ,j,k1)+ &
1576 & (0.5_r8+ &
1577 & sign(0.5_r8, dzdx_r(i ,j,k1)))* &
1578 & ad_cff4
1579 ad_cff4=0.0_r8
1580
1581
1582
1583 ad_dzdx_r(i-1,j,k2)=ad_dzdx_r(i-1,j,k2)+ &
1584 & (0.5_r8+ &
1585 & sign(0.5_r8, dzdx_r(i-1,j,k2)))* &
1586 & ad_cff3
1587 ad_cff3=0.0_r8
1588
1589
1590
1591 ad_dzdx_r(i ,j,k2)=ad_dzdx_r(i ,j,k2)+ &
1592 & (0.5_r8+ &
1593 & sign(0.5_r8,-dzdx_r(i ,j,k2)))* &
1594 & ad_cff2
1595 ad_cff2=0.0_r8
1596
1597
1598
1599 ad_dzdx_r(i-1,j,k1)=ad_dzdx_r(i-1,j,k1)+ &
1600 & (0.5_r8+ &
1601 & sign(0.5_r8,-dzdx_r(i-1,j,k1)))* &
1602 & ad_cff1
1603 ad_cff1=0.0_r8
1604
1605 cff=0.5_r8*(pm(i-1,j)+pm(i,j))
1606
1607
1608
1609
1610
1611 adfac=cff*0.25_r8*ad_dmvdz
1612 ad_dvdz(i-1,j ,k2)=ad_dvdz(i-1,j ,k2)+adfac
1613 ad_dvdz(i ,j ,k2)=ad_dvdz(i ,j ,k2)+adfac
1614 ad_dvdz(i-1,j+1,k2)=ad_dvdz(i-1,j+1,k2)+adfac
1615 ad_dvdz(i ,j+1,k2)=ad_dvdz(i ,j+1,k2)+adfac
1616 ad_dmvdz=0.0_r8
1617
1618
1619 ad_dudz(i,j,k2)=ad_dudz(i,j,k2)+cff*ad_dmudz
1620 ad_dmudz=0.0_r8
1621
1622 cff=0.5_r8*(pn(i-1,j)+pn(i,j))
1623
1624
1625
1626
1627
1628 adfac=cff*0.25_r8*ad_dnvdz
1629 ad_dvdz(i-1,j ,k2)=ad_dvdz(i-1,j ,k2)+adfac
1630 ad_dvdz(i ,j ,k2)=ad_dvdz(i ,j ,k2)+adfac
1631 ad_dvdz(i-1,j+1,k2)=ad_dvdz(i-1,j+1,k2)+adfac
1632 ad_dvdz(i ,j+1,k2)=ad_dvdz(i ,j+1,k2)+adfac
1633 ad_dnvdz=0.0_r8
1634
1635
1636 ad_dudz(i,j,k2)=ad_dudz(i,j,k2)+cff*ad_dnudz
1637 ad_dnudz=0.0_r8
1638#ifdef VISC_3DCOEF
1639
1640
1641
1642 ad_cff=ad_cff+ &
1643 & on_u(i,j)*ad_fac1+om_u(i,j)*ad_fac2
1644 ad_fac1=0.0_r8
1645 ad_fac2=0.0_r8
1646
1647
1648
1649
1650 adfac=0.125_r8*ad_cff
1651 ad_visc3d_r(i-1,j,k )=ad_visc3d_r(i-1,j,k )+adfac
1652 ad_visc3d_r(i ,j,k )=ad_visc3d_r(i ,j,k )+adfac
1653 ad_visc3d_r(i-1,j,k+1)=ad_visc3d_r(i-1,j,k+1)+adfac
1654 ad_visc3d_r(i ,j,k+1)=ad_visc3d_r(i ,j,k+1)+adfac
1655 ad_cff=0.0_r8
1656#endif
1657 END DO
1658 END DO
1659 END IF below_surface
1660
1661 DO j=jstr,jend+1
1662 DO i=istr,iend+1
1663 pm_p=0.25_r8*(pm(i-1,j-1)+pm(i-1,j)+ &
1664 & pm(i ,j-1)+pm(i ,j))
1665 pn_p=0.25_r8*(pn(i-1,j-1)+pn(i-1,j)+ &
1666 & pn(i ,j-1)+pn(i ,j))
1667 cff1=min(dzdx_p(i,j,k1),0.0_r8)
1668 cff2=max(dzdx_p(i,j,k1),0.0_r8)
1669 cff3=min(dzde_p(i,j,k1),0.0_r8)
1670 cff4=max(dzde_p(i,j,k1),0.0_r8)
1671#ifdef VISC_3DCOEF
1672 cff=0.25_r8* &
1673 & (hz(i-1,j ,k)+hz(i,j ,k)+ &
1674 & hz(i-1,j-1,k)+hz(i,j-1,k))* &
1675 & (on_p(i,j)*(dnvdx(i,j,k1)- &
1676 & 0.5_r8*pn_p* &
1677 & (cff1*(dvdz(i-1,j,k1)+ &
1678 & dvdz(i ,j,k2))+ &
1679 & cff2*(dvdz(i-1,j,k2)+ &
1680 & dvdz(i ,j,k1))))+ &
1681 & om_p(i,j)*(dmude(i,j,k1)- &
1682 & 0.5_r8*pm_p* &
1683 & (cff3*(dudz(i,j-1,k1)+ &
1684 & dudz(i,j ,k2))+ &
1685 & cff4*(dudz(i,j-1,k2)+ &
1686 & dudz(i,j ,k1)))))
1687# ifdef MASKING
1688 cff=cff*pmask(i,j)
1689# endif
1690 visc_p=0.25_r8* &
1691 & (visc3d_r(i-1,j-1,k)+visc3d_r(i-1,j,k)+ &
1692 & visc3d_r(i ,j-1,k)+visc3d_r(i ,j,k))
1693
1694
1695
1696 adfac=on_p(i,j)*on_p(i,j)*ad_vfx(i,j)
1697 ad_cff=ad_cff+visc_p*adfac
1698 ad_visc_p=ad_visc_p+cff*adfac
1699 ad_vfx(i,j)=0.0_r8
1700
1701
1702
1703 adfac=om_p(i,j)*om_p(i,j)*ad_ufe(i,j)
1704 ad_cff=ad_cff+visc_p*adfac
1705 ad_visc_p=ad_visc_p+cff*adfac
1706 ad_ufe(i,j)=0.0_r8
1707
1708
1709
1710
1711 adfac=0.25_r8*ad_visc_p
1712 ad_visc3d_r(i-1,j-1,k)=ad_visc3d_r(i-1,j-1,k)+adfac
1713 ad_visc3d_r(i ,j-1,k)=ad_visc3d_r(i ,j-1,k)+adfac
1714 ad_visc3d_r(i-1,j ,k)=ad_visc3d_r(i-1,j ,k)+adfac
1715 ad_visc3d_r(i ,j ,k)=ad_visc3d_r(i ,j ,k)+adfac
1716 ad_visc_p=0.0_r8
1717#else
1718
1719
1720
1721 ad_cff=ad_cff+ &
1722 & on_p(i,j)*on_p(i,j)*visc2_p(i,j)*ad_vfx(i,j)+ &
1723 & om_p(i,j)*om_p(i,j)*visc2_p(i,j)*ad_ufe(i,j)
1724 ad_vfx(i,j)=0.0_r8
1725 ad_ufe(i,j)=0.0_r8
1726#endif
1727#ifdef MASKING
1728
1729
1730 ad_cff=ad_cff*pmask(i,j)
1731#endif
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770 adfac=0.25_r8*ad_cff
1771 ad_cff=0.0_r8
1772 adfac1=adfac*(on_p(i,j)*(dnvdx(i,j,k1)- &
1773 & 0.5_r8*pn_p* &
1774 & (cff1*(dvdz(i-1,j,k1)+ &
1775 & dvdz(i ,j,k2))+ &
1776 & cff2*(dvdz(i-1,j,k2)+ &
1777 & dvdz(i ,j,k1))))+ &
1778 & om_p(i,j)*(dmude(i,j,k1)- &
1779 & 0.5_r8*pm_p* &
1780 & (cff3*(dudz(i,j-1,k1)+ &
1781 & dudz(i,j ,k2))+ &
1782 & cff4*(dudz(i,j-1,k2)+ &
1783 & dudz(i,j ,k1)))))
1784 adfac2=adfac*(hz(i-1,j ,k)+hz(i,j ,k)+ &
1785 & hz(i-1,j-1,k)+hz(i,j-1,k))
1786 adfac3=adfac2*on_p(i,j)
1787 adfac4=adfac3*0.5_r8*pn_p
1788 adfac5=adfac2*om_p(i,j)
1789 adfac6=adfac5*0.5_r8*pm_p
1790 ad_hz(i-1,j-1,k)=ad_hz(i-1,j-1,k)+adfac1
1791 ad_hz(i ,j-1,k)=ad_hz(i ,j-1,k)+adfac1
1792 ad_hz(i-1,j ,k)=ad_hz(i-1,j ,k)+adfac1
1793 ad_hz(i ,j ,k)=ad_hz(i ,j ,k)+adfac1
1794 ad_dnvdx(i,j,k1)=ad_dnvdx(i,j,k1)+adfac3
1795 ad_cff1=ad_cff1- &
1796 & (dvdz(i-1,j,k1)+dvdz(i ,j,k2))*adfac4
1797 ad_cff2=ad_cff2- &
1798 & (dvdz(i-1,j,k2)+dvdz(i ,j,k1))*adfac4
1799 ad_dvdz(i-1,j,k1)=ad_dvdz(i-1,j,k1)-cff1*adfac4
1800 ad_dvdz(i-1,j,k2)=ad_dvdz(i-1,j,k2)-cff2*adfac4
1801 ad_dvdz(i ,j,k1)=ad_dvdz(i ,j,k1)-cff2*adfac4
1802 ad_dvdz(i ,j,k2)=ad_dvdz(i ,j,k2)-cff1*adfac4
1803 ad_dmude(i,j,k1)=ad_dmude(i,j,k1)+adfac5
1804 ad_cff3=ad_cff3- &
1805 & (dudz(i,j-1,k1)+dudz(i,j ,k2))*adfac6
1806 ad_cff4=ad_cff4- &
1807 & (dudz(i,j-1,k2)+dudz(i,j ,k1))*adfac6
1808 ad_dudz(i,j-1,k1)=ad_dudz(i,j-1,k1)-cff3*adfac6
1809 ad_dudz(i,j-1,k2)=ad_dudz(i,j-1,k2)-cff4*adfac6
1810 ad_dudz(i,j ,k1)=ad_dudz(i,j ,k1)-cff4*adfac6
1811 ad_dudz(i,j ,k2)=ad_dudz(i,j ,k2)-cff3*adfac6
1812
1813
1814
1815
1816
1817 ad_dzde_p(i,j,k1)=ad_dzde_p(i,j,k1)+ &
1818 & (0.5_r8+ &
1819 & sign(0.5_r8, dzde_p(i,j,k1)))* &
1820 & ad_cff4+ &
1821 & (0.5_r8+ &
1822 & sign(0.5_r8,-dzde_p(i,j,k1)))* &
1823 & ad_cff3
1824 ad_cff4=0.0_r8
1825 ad_cff3=0.0_r8
1826
1827
1828
1829
1830
1831 ad_dzdx_p(i,j,k1)=ad_dzdx_p(i,j,k1)+ &
1832 & (0.5_r8+ &
1833 & sign(0.5_r8, dzdx_p(i,j,k1)))* &
1834 & ad_cff2+ &
1835 & (0.5_r8+ &
1836 & sign(0.5_r8,-dzdx_p(i,j,k1)))* &
1837 & ad_cff1
1838 ad_cff2=0.0_r8
1839 ad_cff1=0.0_r8
1840 END DO
1841 END DO
1842
1843 DO j=jstrv-1,jend
1844 DO i=istru-1,iend
1845 cff1=min(dzdx_r(i,j,k1),0.0_r8)
1846 cff2=max(dzdx_r(i,j,k1),0.0_r8)
1847 cff3=min(dzde_r(i,j,k1),0.0_r8)
1848 cff4=max(dzde_r(i,j,k1),0.0_r8)
1849#ifdef VISC_3DCOEF
1850 cff=hz(i,j,k)* &
1851 & (on_r(i,j)*(dnudx(i,j,k1)- &
1852 & 0.5_r8*pn(i,j)* &
1853 & (cff1*(dudz(i ,j,k1)+ &
1854 & dudz(i+1,j,k2))+ &
1855 & cff2*(dudz(i ,j,k2)+ &
1856 & dudz(i+1,j,k1))))- &
1857 & om_r(i,j)*(dmvde(i,j,k1)- &
1858 & 0.5_r8*pm(i,j)* &
1859 & (cff3*(dvdz(i,j ,k1)+ &
1860 & dvdz(i,j+1,k2))+ &
1861 & cff4*(dvdz(i,j ,k2)+ &
1862 & dvdz(i,j+1,k1)))))
1863# ifdef MASKING
1864 cff=cff*rmask(i,j)
1865# endif
1866
1867
1868
1869
1870 adfac=om_r(i,j)*om_r(i,j)*ad_vfe(i,j)
1871 ad_cff=ad_cff+visc3d_r(i,j,k)*adfac
1872 ad_visc3d_r(i,j,k)=ad_visc3d_r(i,j,k)+cff*adfac
1873 ad_vfe(i,j)=0.0_r8
1874
1875
1876
1877
1878 adfac=on_r(i,j)*on_r(i,j)*ad_ufx(i,j)
1879 ad_cff=ad_cff+visc3d_r(i,j,k)*adfac
1880 ad_visc3d_r(i,j,k)=ad_visc3d_r(i,j,k)+cff*adfac
1881 ad_ufx(i,j)=0.0_r8
1882#else
1883
1884
1885
1886 ad_cff=ad_cff+ &
1887 & om_r(i,j)*om_r(i,j)*visc2_r(i,j)*ad_vfe(i,j)+ &
1888 & on_r(i,j)*on_r(i,j)*visc2_r(i,j)*ad_ufx(i,j)
1889 ad_vfe(i,j)=0.0_r8
1890 ad_ufx(i,j)=0.0_r8
1891#endif
1892#ifdef MASKING
1893
1894
1895 ad_cff=ad_cff*rmask(i,j)
1896#endif
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932 adfac1=hz(i,j,k)*ad_cff
1933 adfac2=adfac1*on_r(i,j)
1934 adfac3=adfac2*0.5_r8*pn(i,j)
1935 adfac4=adfac1*om_r(i,j)
1936 adfac5=adfac4*0.5_r8*pm(i,j)
1937 ad_hz(i,j,k)=ad_hz(i,j,k)+ &
1938 (on_r(i,j)*(dnudx(i,j,k1)- &
1939 & 0.5_r8*pn(i,j)* &
1940 & (cff1*(dudz(i ,j,k1)+ &
1941 & dudz(i+1,j,k2))+ &
1942 & cff2*(dudz(i ,j,k2)+ &
1943 & dudz(i+1,j,k1))))- &
1944 & om_r(i,j)*(dmvde(i,j,k1)- &
1945 & 0.5_r8*pm(i,j)* &
1946 & (cff3*(dvdz(i,j ,k1)+ &
1947 & dvdz(i,j+1,k2))+ &
1948 & cff4*(dvdz(i,j ,k2)+ &
1949 & dvdz(i,j+1,k1)))))* &
1950 & ad_cff
1951 ad_dnudx(i,j,k1)=ad_dnudx(i,j,k1)+adfac2
1952 ad_cff1=ad_cff1- &
1953 & (dudz(i ,j,k1)+dudz(i+1,j,k2))*adfac3
1954 ad_cff2=ad_cff2- &
1955 (dudz(i ,j,k2)+dudz(i+1,j,k1))*adfac3
1956 ad_dudz(i ,j,k1)=ad_dudz(i ,j,k1)-cff1*adfac3
1957 ad_dudz(i ,j,k2)=ad_dudz(i ,j,k2)-cff2*adfac3
1958 ad_dudz(i+1,j,k1)=ad_dudz(i+1,j,k1)-cff2*adfac3
1959 ad_dudz(i+1,j,k2)=ad_dudz(i+1,j,k2)-cff1*adfac3
1960 ad_dmvde(i,j,k1)=ad_dmvde(i,j,k1)-adfac4
1961 ad_cff3=ad_cff3+ &
1962 & (dvdz(i,j ,k1)+dvdz(i,j+1,k2))*adfac5
1963 ad_cff4=ad_cff4+ &
1964 & (dvdz(i,j ,k2)+dvdz(i,j+1,k1))*adfac5
1965 ad_dvdz(i,j ,k1)=ad_dvdz(i,j ,k1)+cff3*adfac5
1966 ad_dvdz(i,j ,k2)=ad_dvdz(i,j ,k2)+cff4*adfac5
1967 ad_dvdz(i,j+1,k1)=ad_dvdz(i,j+1,k1)+cff4*adfac5
1968 ad_dvdz(i,j+1,k2)=ad_dvdz(i,j+1,k2)+cff3*adfac5
1969 ad_cff=0.0_r8
1970
1971
1972
1973
1974
1975 ad_dzde_r(i,j,k1)=ad_dzde_r(i,j,k1)+ &
1976 & (0.5_r8+ &
1977 & sign(0.5_r8, dzde_r(i,j,k1)))* &
1978 & ad_cff4+ &
1979 & (0.5_r8+ &
1980 & sign(0.5_r8,-dzde_r(i,j,k1)))* &
1981 & ad_cff3
1982 ad_cff4=0.0_r8
1983 ad_cff3=0.0_r8
1984
1985
1986
1987
1988
1989 ad_dzdx_r(i,j,k1)=ad_dzdx_r(i,j,k1)+ &
1990 & (0.5_r8+ &
1991 & sign(0.5_r8, dzdx_r(i,j,k1)))* &
1992 & ad_cff2+ &
1993 & (0.5_r8+ &
1994 & sign(0.5_r8,-dzdx_r(i,j,k1)))* &
1995 & ad_cff1
1996 ad_cff2=0.0_r8
1997 ad_cff1=0.0_r8
1998 END DO
1999 END DO
2000 END IF above_bottom
2001
2002 IF ((k.eq.0).or.(k.eq.
n(ng)))
THEN
2003 DO j=jstrv-1,jend+1
2004 DO i=istr-1,iend+1
2005
2006
2007 ad_vfse(i,j,k2)=0.0_r8
2008
2009
2010 ad_vfsx(i,j,k2)=0.0_r8
2011 END DO
2012 END DO
2013 DO j=jstr-1,jend+1
2014 DO i=istru-1,iend+1
2015
2016
2017 ad_ufse(i,j,k2)=0.0_r8
2018
2019
2020 ad_ufsx(i,j,k2)=0.0_r8
2021 END DO
2022 END DO
2023
2024 DO j=jstrv-1,jend+1
2025 DO i=istr-1,iend+1
2026
2027
2028 ad_dvdz(i,j,k2)=0.0_r8
2029 END DO
2030 END DO
2031 DO j=jstr-1,jend+1
2032 DO i=istru-1,iend+1
2033
2034
2035
2036 ad_dudz(i,j,k2)=0.0_r8
2037 END DO
2038 END DO
2039 ELSE
2040 DO j=jstrv-1,jend+1
2041 DO i=istr-1,iend+1
2042 cff=1.0_r8/(0.5_r8*(z_r(i,j-1,k+1)-z_r(i,j-1,k)+ &
2043 & z_r(i,j ,k+1)-z_r(i,j ,k)))
2044
2045
2046
2047
2048
2049 adfac=cff*ad_dvdz(i,j,k2)
2050 ad_v(i,j,k ,nrhs)=ad_v(i,j,k ,nrhs)-adfac
2051 ad_v(i,j,k+1,nrhs)=ad_v(i,j,k+1,nrhs)+adfac
2052 ad_cff=ad_cff+(v(i,j,k+1,nrhs)- &
2053 & v(i,j,k ,nrhs))*ad_dvdz(i,j,k2)
2054 ad_dvdz(i,j,k2)=0.0_r8
2055
2056
2057
2058
2059
2060 adfac=-cff*cff*0.5_r8*ad_cff
2061 ad_z_r(i,j-1,k )=ad_z_r(i,j-1,k )-adfac
2062 ad_z_r(i,j-1,k+1)=ad_z_r(i,j-1,k+1)+adfac
2063 ad_z_r(i,j ,k )=ad_z_r(i,j ,k )-adfac
2064 ad_z_r(i,j ,k+1)=ad_z_r(i,j ,k+1)+adfac
2065 ad_cff=0.0_r8
2066 END DO
2067 END DO
2068
2069 DO j=jstr-1,jend+1
2070 DO i=istru-1,iend+1
2071 cff=1.0_r8/(0.5_r8*(z_r(i-1,j,k+1)-z_r(i-1,j,k)+ &
2072 & z_r(i ,j,k+1)-z_r(i ,j,k)))
2073
2074
2075
2076
2077
2078 adfac=cff*ad_dudz(i,j,k2)
2079 ad_u(i,j,k ,nrhs)=ad_u(i,j,k ,nrhs)-adfac
2080 ad_u(i,j,k+1,nrhs)=ad_u(i,j,k+1,nrhs)+adfac
2081 ad_cff=ad_cff+(u(i,j,k+1,nrhs)- &
2082 & u(i,j,k ,nrhs))*ad_dudz(i,j,k2)
2083 ad_dudz(i,j,k2)=0.0_r8
2084
2085
2086
2087
2088
2089 adfac=-cff*cff*0.5_r8*ad_cff
2090 ad_z_r(i-1,j,k )=ad_z_r(i-1,j,k )-adfac
2091 ad_z_r(i-1,j,k+1)=ad_z_r(i-1,j,k+1)+adfac
2092 ad_z_r(i ,j,k )=ad_z_r(i ,j,k )-adfac
2093 ad_z_r(i ,j,k+1)=ad_z_r(i ,j,k+1)+adfac
2094 ad_cff=0.0_r8
2095 END DO
2096 END DO
2097 END IF
2098
2099 IF (k.lt.
n(ng))
THEN
2100 DO j=jstrv-1,jend
2101 DO i=istru-1,iend
2102 cff=0.5_r8*pn(i,j)
2103#ifdef MASKING
2104 cff=cff*rmask(i,j)
2105#endif
2106
2107
2108
2109
2110
2111 adfac=cff*ad_dmvde(i,j,k2)
2112 ad_v(i,j ,k+1,nrhs)=ad_v(i,j ,k+1,nrhs)- &
2113 & (pm(i,j-1)+pm(i,j ))*adfac
2114 ad_v(i,j+1,k+1,nrhs)=ad_v(i,j+1,k+1,nrhs)+ &
2115 & (pm(i,j )+pm(i,j+1))*adfac
2116 ad_dmvde(i,j,k2)=0.0_r8
2117 END DO
2118 END DO
2119
2120 DO j=jstr,jend+1
2121 DO i=istru-1,iend+1
2122 cff=0.125_r8*(pm(i-1,j )+pm(i,j )+ &
2123 & pm(i-1,j-1)+pm(i,j-1))
2124#ifdef MASKING
2125 cff=cff*pmask(i,j)
2126#endif
2127
2128
2129
2130
2131
2132 adfac=cff*ad_dnvdx(i,j,k2)
2133 ad_v(i-1,j,k+1,nrhs)=ad_v(i-1,j,k+1,nrhs)- &
2134 & (pn(i-1,j-1)+pn(i-1,j))*adfac
2135 ad_v(i ,j,k+1,nrhs)=ad_v(i ,j,k+1,nrhs)+ &
2136 & (pn(i ,j-1)+pn(i ,j))*adfac
2137 ad_dnvdx(i,j,k2)=0.0_r8
2138 END DO
2139 END DO
2140
2141 DO j=jstr,jend+1
2142 DO i=istr,iend+1
2143 cff=0.125_r8*(pn(i-1,j )+pn(i,j )+ &
2144 & pn(i-1,j-1)+pn(i,j-1))
2145#ifdef MASKING
2146 cff=cff*pmask(i,j)
2147#endif
2148
2149
2150
2151
2152
2153 adfac=cff*ad_dmude(i,j,k2)
2154 ad_u(i,j-1,k+1,nrhs)=ad_u(i,j-1,k+1,nrhs)- &
2155 & (pm(i-1,j-1)+pm(i,j-1))*adfac
2156 ad_u(i,j ,k+1,nrhs)=ad_u(i,j ,k+1,nrhs)+ &
2157 & (pm(i-1,j )+pm(i,j ))*adfac
2158 ad_dmude(i,j,k2)=0.0_r8
2159 END DO
2160 END DO
2161
2162 DO j=jstrv-1,jend
2163 DO i=istru-1,iend
2164 cff=0.5_r8*pm(i,j)
2165#ifdef MASKING
2166 cff=cff*rmask(i,j)
2167#endif
2168
2169
2170
2171
2172
2173 adfac=cff*ad_dnudx(i,j,k2)
2174 ad_u(i ,j,k+1,nrhs)=ad_u(i ,j,k+1,nrhs)- &
2175 & (pn(i-1,j)+pn(i ,j))*adfac
2176 ad_u(i+1,j,k+1,nrhs)=ad_u(i+1,j,k+1,nrhs)+ &
2177 & (pn(i ,j)+pn(i+1,j))*adfac
2178 ad_dnudx(i,j,k2)=0.0_r8
2179 END DO
2180 END DO
2181
2182
2183
2184 DO j=jstrv-1,jend
2185 DO i=istru-1,iend
2186
2187
2188
2189 adfac=0.5_r8*ad_dzde_r(i,j,k2)
2190 ad_vfe(i,j )=ad_vfe(i,j )+adfac
2191 ad_vfe(i,j+1)=ad_vfe(i,j+1)+adfac
2192 ad_dzde_r(i,j,k2)=0.0_r8
2193
2194
2195
2196 adfac=0.5_r8*ad_dzdx_r(i,j,k2)
2197 ad_ufx(i ,j)=ad_ufx(i ,j)+adfac
2198 ad_ufx(i+1,j)=ad_ufx(i+1,j)+adfac
2199 ad_dzdx_r(i,j,k2)=0.0_r8
2200 END DO
2201 END DO
2202
2203 DO j=jstr,jend+1
2204 DO i=istr,iend+1
2205
2206
2207
2208 adfac=0.5_r8*ad_dzde_p(i,j,k2)
2209 ad_vfe(i-1,j)=ad_vfe(i-1,j)+adfac
2210 ad_vfe(i ,j)=ad_vfe(i ,j)+adfac
2211 ad_dzde_p(i,j,k2)=0.0_r8
2212
2213
2214
2215 adfac=0.5_r8*ad_dzdx_p(i,j,k2)
2216 ad_ufx(i,j-1)=ad_ufx(i,j-1)+adfac
2217 ad_ufx(i,j )=ad_ufx(i,j )+adfac
2218 ad_dzdx_p(i,j,k2)=0.0_r8
2219 END DO
2220 END DO
2221
2222 DO j=jstrv-1,jend+1
2223 DO i=istr-1,iend+1
2224 cff=0.5_r8*(pn(i,j-1)+pn(i,j))
2225#ifdef MASKING
2226 cff=cff*vmask(i,j)
2227#endif
2228
2229
2230
2231 adfac=cff*ad_vfe(i,j)
2232 ad_z_r(i,j-1,k+1)=ad_z_r(i,j-1,k+1)-adfac
2233 ad_z_r(i,j ,k+1)=ad_z_r(i,j ,k+1)+adfac
2234 ad_vfe(i,j)=0.0_r8
2235 END DO
2236 END DO
2237
2238 DO j=jstr-1,jend+1
2239 DO i=istru-1,iend+1
2240 cff=0.5_r8*(pm(i-1,j)+pm(i,j))
2241#ifdef MASKING
2242 cff=cff*umask(i,j)
2243#endif
2244
2245
2246
2247 adfac=cff*ad_ufx(i,j)
2248 ad_z_r(i-1,j,k+1)=ad_z_r(i-1,j,k+1)-adfac
2249 ad_z_r(i ,j,k+1)=ad_z_r(i ,j,k+1)+adfac
2250 ad_ufx(i,j)=0.0_r8
2251 END DO
2252 END DO
2253 END IF
2254
2255
2256
2257 kt=k2
2258 k2=k1
2259 k1=kt
2260 END DO k_loop
2261
2262 RETURN
integer, dimension(:), allocatable n
real(dp), dimension(:), allocatable dt