154
155
159# ifdef SEDIMENT_NOT_YET
161# endif
162
165# ifdef DISTRIBUTE
167# endif
168
169
170
171 integer, intent(in) :: ng, tile, model
172 integer, intent(in) :: LBi, UBi, LBj, UBj
173 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
174 integer, intent(in) :: nrhs
175
176# ifdef ASSUMED_SHAPE
177# ifdef MASKING
178 real(r8), intent(in) :: rmask(LBi:,LBj:)
179# endif
180# ifdef VAR_RHO_2D_NOT_YET
181 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
182# endif
183 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
184# if defined BV_FREQUENCY_NOT_YET || defined VAR_RHO_2D_NOT_YET
185 real(r8), intent(in) :: z_w(LBi:,LBj:,0:)
186# endif
187 real(r8), intent(in) :: t(LBi:,LBj:,:,:,:)
188 real(r8), intent(in) :: rho(LBi:,LBj:,:)
189
190# ifdef VAR_RHO_2D_NOT_YET
191 real(r8), intent(inout) :: ad_Hz(LBi:,LBj:,:)
192# endif
193 real(r8), intent(inout) :: ad_z_r(LBi:,LBj:,:)
194# if defined BV_FREQUENCY_NOT_YET || defined VAR_RHO_2D_NOT_YET
195 real(r8), intent(inout) :: ad_z_w(LBi:,LBj:,0:)
196# endif
197 real(r8), intent(inout) :: ad_t(LBi:,LBj:,:,:,:)
198# ifdef VAR_RHO_2D_NOT_YET
199 real(r8), intent(inout) :: ad_rhoA(LBi:,LBj:)
200 real(r8), intent(inout) :: ad_rhoS(LBi:,LBj:)
201# endif
202# ifdef BV_FREQUENCY_NOT_YET
203 real(r8), intent(inout) :: ad_bvf(LBi:,LBj:,0:)
204# endif
205# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET || \
206 defined bulk_fluxes_not_yet
207 real(r8), intent(inout) :: ad_alpha(LBi:,LBj:)
208 real(r8), intent(inout) :: ad_beta(LBi:,LBj:)
209# ifdef LMD_DDMIX_NOT_YET
210 real(r8), intent(inout) :: ad_alfaobeta(LBi:,LBj:,0:)
211# endif
212# endif
213# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET
214 real(r8), intent(inout) :: ad_pden(LBi:,LBj:,:)
215# endif
216 real(r8), intent(inout) :: ad_rho(LBi:,LBj:,:)
217# else
218# ifdef MASKING
219 real(r8), intent(in) :: rmask(LBi:UBi,LBj:UBj)
220# endif
221# ifdef VAR_RHO_2D_NOT_YET
222 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
223# endif
224 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
225# if defined BV_FREQUENCY_NOT_YET || defined VAR_RHO_2D_NOT_YET
226 real(r8), intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
227# endif
228 real(r8), intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
229 real(r8), intent(in) :: rho(LBi:UBi,LBj:UBj,N(ng))
230
231# ifdef VAR_RHO_2D_NOT_YET
232 real(r8), intent(inout) :: ad_Hz(LBi:UBi,LBj:UBj,N(ng))
233# endif
234 real(r8), intent(inout) :: ad_z_r(LBi:UBi,LBj:UBj,N(ng))
235# if defined BV_FREQUENCY_NOT_YET || defined VAR_RHO_2D_NOT_YET
236 real(r8), intent(inout) :: ad_z_w(LBi:UBi,LBj:UBj,0:N(ng))
237# endif
238 real(r8), intent(inout) :: ad_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
239
240# ifdef VAR_RHO_2D_NOT_YET
241 real(r8), intent(inout) :: ad_rhoA(LBi:UBi,LBj:UBj)
242 real(r8), intent(inout) :: ad_rhoS(LBi:UBi,LBj:UBj)
243# endif
244# ifdef BV_FREQUENCY_NOT_YET
245 real(r8), intent(inout) :: ad_bvf(LBi:UBi,LBj:UBj,0:N(ng))
246# endif
247# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET || \
248 defined bulk_fluxes_not_yet
249 real(r8), intent(inout) :: ad_alpha(LBi:UBi,LBj:UBj)
250 real(r8), intent(inout) :: ad_beta(LBi:UBi,LBj:UBj)
251# ifdef LMD_DDMIX_NOT_YET
252 real(r8), intent(inout) :: ad_alfaobeta(LBi:UBi,LBj:UBj,0:N(ng))
253# endif
254# endif
255# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET
256 real(r8), intent(inout) :: ad_pden(LBi:UBi,LBj:UBj,N(ng))
257# endif
258 real(r8), intent(inout) :: ad_rho(LBi:UBi,LBj:UBj,N(ng))
259# endif
260
261
262
263 integer :: i, ised, itrc, j, k
264
265 real(r8) :: SedDen, Tp, Tpr10, Ts, Tt, sqrtTs
266 real(r8) :: ad_SedDen, ad_Tp, ad_Tpr10, ad_Ts, ad_Tt, ad_sqrtTs
267# ifdef BV_FREQUENCY_NOT_YET
268 real(r8) :: bulk_dn, bulk_up, den_dn, den_up
269 real(r8) :: ad_bulk_dn, ad_bulk_up, ad_den_dn, ad_den_up
270# endif
271 real(r8) :: cff, cff1, cff2, cff3
272 real(r8) :: ad_cff, ad_cff1, ad_cff2, ad_cff3
273 real(r8) :: adfac, adfac1, adfac2, adfac3
274
275 real(r8), dimension(0:9) :: C
276 real(r8), dimension(0:9) :: ad_C
277# ifdef EOS_TDERIVATIVE
278 real(r8), dimension(0:9) :: dCdT(0:9)
279 real(r8), dimension(0:9) :: ad_dCdT(0:9)
280 real(r8), dimension(0:9) :: d2Cd2T(0:9)
281
282 real(r8), dimension(IminS:ImaxS,N(ng)) :: DbulkDS
283 real(r8), dimension(IminS:ImaxS,N(ng)) :: DbulkDT
284 real(r8), dimension(IminS:ImaxS,N(ng)) :: Dden1DS
285 real(r8), dimension(IminS:ImaxS,N(ng)) :: Dden1DT
286 real(r8), dimension(IminS:ImaxS,N(ng)) :: Scof
287 real(r8), dimension(IminS:ImaxS,N(ng)) :: Tcof
288 real(r8), dimension(IminS:ImaxS,N(ng)) :: wrk
289
290 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_DbulkDS
291 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_DbulkDT
292 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_Dden1DS
293 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_Dden1DT
294 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_Scof
295 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_Tcof
296 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_wrk
297# endif
298 real(r8), dimension(IminS:ImaxS,N(ng)) :: bulk
299 real(r8), dimension(IminS:ImaxS,N(ng)) :: bulk0
300 real(r8), dimension(IminS:ImaxS,N(ng)) :: bulk1
301 real(r8), dimension(IminS:ImaxS,N(ng)) :: bulk2
302 real(r8), dimension(IminS:ImaxS,N(ng)) :: den
303 real(r8), dimension(IminS:ImaxS,N(ng)) :: den1
304
305 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_bulk
306 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_bulk0
307 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_bulk1
308 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_bulk2
309 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_den
310 real(r8), dimension(IminS:ImaxS,N(ng)) :: ad_den1
311
312# ifdef VAR_RHO_2D_NOT_YET
313 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: rhoA1
314 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: rhoS1
315# endif
316
317# include "set_bounds.h"
318
319
320
321
322
323 ad_tt=0.0_r8
324 ad_ts=0.0_r8
325 ad_tp=0.0_r8
326 ad_tpr10=0.0_r8
327# ifdef BV_FREQUENCY_NOT_YET
328 ad_bulk_dn=0.0_r8
329 ad_bulk_up=0.0_r8
330 ad_den_dn=0.0_r8
331 ad_den_up=0.0_r8
332# endif
333 ad_sqrtts=0.0_r8
334 ad_cff=0.0_r8
335 ad_cff1=0.0_r8
336 ad_cff2=0.0_r8
337 ad_cff3=0.0_r8
338
339 ad_c=0.0_r8
340 ad_dcdt=0.0_r8
341
343 DO i=imins,imaxs
344# ifdef EOS_TDERIVATIVE
345 ad_dbulkds(i,k)=0.0_r8
346 ad_dbulkdt(i,k)=0.0_r8
347 ad_dden1ds(i,k)=0.0_r8
348 ad_dden1dt(i,k)=0.0_r8
349 ad_scof(i,k)=0.0_r8
350 ad_tcof(i,k)=0.0_r8
351 ad_wrk(i,k)=0.0_r8
352# endif
353 ad_bulk(i,k)=0.0_r8
354 ad_bulk0(i,k)=0.0_r8
355 ad_bulk1(i,k)=0.0_r8
356 ad_bulk2(i,k)=0.0_r8
357 ad_den(i,k)=0.0_r8
358 ad_den1(i,k)=0.0_r8
359 END DO
360 END DO
361
362
363
364
365
366
367
368
369
370
371
372# ifdef DISTRIBUTE
373# ifdef BV_FREQUENCY_NOT_YET
374
375
376
377
378
379
381 & lbi, ubi, lbj, ubj, 0,
n(ng), &
384 & ad_bvf)
385# endif
386# ifdef VAR_RHO_2D_NOT_YET
387
388
389
390
391
392
394 & lbi, ubi, lbj, ubj, &
397 & ad_rhoa, ad_rhos)
398# endif
399# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET || \
400 defined bulk_fluxes_not_yet
401
402
403
404
405
406
408 & lbi, ubi, lbj, ubj, &
411 & ad_alpha, ad_beta)
412# ifdef LMD_DDMIX_NOT_YET
413
414
415
416
417
418
420 & lbi, ubi, lbj, ubj, 0,
n(ng), &
423 & ad_alfaobeta)
424# endif
425# endif
426# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET
427
428
429
430
431
432
434 & lbi, ubi, lbj, ubj, 1,
n(ng), &
437 & ad_pden)
438# endif
439
440
441
442
443
444
446 & lbi, ubi, lbj, ubj, 1,
n(ng), &
449 & ad_rho)
450
451# endif
452
454# ifdef BV_FREQUENCY_NOT_YET
455
456
457
458
460 & lbi, ubi, lbj, ubj, 0,
n(ng), &
461 & ad_bvf)
462# endif
463# ifdef VAR_RHO_2D_NOT_YET
464
465
466
467
469 & lbi, ubi, lbj, ubj, &
470 & ad_rhos)
471
472
473
474
476 & lbi, ubi, lbj, ubj, &
477 & ad_rhoa)
478# endif
479# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET || \
480 defined bulk_fluxes_not_yet
481
482
483
484
486 & lbi, ubi, lbj, ubj, &
487 & ad_beta)
488
489
490
491
493 & lbi, ubi, lbj, ubj, &
494 & ad_alpha)
495# ifdef LMD_DDMIX_NOT_YET
496
497
498
499
501 & lbi, ubi, lbj, ubj, 0,
n(ng), &
502 & ad_alfaobeta)
503# endif
504# endif
505# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET
506
507
508
509
511 & lbi, ubi, lbj, ubj, 1,
n(ng), &
512 & ad_pden)
513# endif
514
515
516
517
519 & lbi, ubi, lbj, ubj, 1,
n(ng), &
520 & ad_rho)
521 END IF
522
523
524
525
526
527 DO j=jstrt,jendt
529 DO i=istrt,iendt
530 tt=max(-2.0_r8,t(i,j,k,nrhs,
itemp))
531# ifdef SALINITY
532 ts=max(0.0_r8,t(i,j,k,nrhs,
isalt))
533 sqrtts=sqrt(ts)
534# else
535 ts=0.0_r8
536 sqrtts=0.0_r8
537# endif
538 tp=z_r(i,j,k)
539 tpr10=0.1_r8*tp
540
541
542
543
554# ifdef EOS_TDERIVATIVE
555
556 dcdt(0)=
q01+tt*(2.0_r8*
q02+tt*(3.0_r8*
q03+tt*(4.0_r8*
q04+ &
558 dcdt(1)=
u01+tt*(2.0_r8*
u02+tt*(3.0_r8*
u03+tt*4.0_r8*
u04))
560 dcdt(3)=
a01+tt*(2.0_r8*
a02+tt*(3.0_r8*
a03+tt*4.0_r8*
a04))
561 dcdt(4)=
b01+tt*(2.0_r8*
b02+tt*3.0_r8*
b03)
563 dcdt(6)=
e01+tt*(2.0_r8*
e02+tt*3.0_r8*
e03)
567
568 d2cd2t(0)=2.0_r8*
q02+tt*(6.0_r8*
q03+tt*(12.0_r8*
q04+ &
570 d2cd2t(1)=2.0_r8*
u02+tt*(6.0_r8*
u03+tt*12.0_r8*
u04)
572 d2cd2t(3)=2.0_r8*
a02+tt*(6.0_r8*
a03+tt*12.0_r8*
a04)
573 d2cd2t(4)=2.0_r8*
b02+tt*6.0_r8*
b03
575 d2cd2t(6)=2.0_r8*
e02+tt*6.0_r8*
e03
579# endif
580
581
582
583
584 den1(i,k)=c(0)+ts*(c(1)+sqrtts*c(2)+ts*
w00)
585
586# ifdef EOS_TDERIVATIVE
587
588
589
590
591
592 dden1ds(i,k)=c(1)+1.5_r8*c(2)*sqrtts+2.0_r8*
w00*ts
593 dden1dt(i,k)=dcdt(0)+ts*(dcdt(1)+sqrtts*dcdt(2))
594# endif
595
596
597
598 bulk0(i,k)=c(3)+ts*(c(4)+sqrtts*c(5))
599 bulk1(i,k)=c(6)+ts*(c(7)+sqrtts*
g00)
600 bulk2(i,k)=c(8)+ts*c(9)
601 bulk(i,k)=bulk0(i,k)-tp*(bulk1(i,k)-tp*bulk2(i,k))
602
603# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET || \
604 defined bulk_fluxes_not_yet
605
606
607
608
609
610 dbulkds(i,k)=c(4)+sqrtts*1.5_r8*c(5)- &
611 & tp*(c(7)+sqrtts*1.5_r8*
g00-tp*c(9))
612 dbulkdt(i,k)=dcdt(3)+ts*(dcdt(4)+sqrtts*dcdt(5))- &
613 & tp*(dcdt(6)+ts*dcdt(7)- &
614 & tp*(dcdt(8)+ts*dcdt(9)))
615# endif
616
617
618
619
620
621 cff=1.0_r8/(bulk(i,k)+tpr10)
622 den(i,k)=den1(i,k)*bulk(i,k)*cff
623# if defined SEDIMENT_NOT_YET && defined SED_DENS_NOT_YET
624 sedden=0.0_r8
626 cff1=1.0_r8/
srho(ised,ng)
627 sedden=sedden+ &
628 & t(i,j,k,nrhs,
idsed(ised))* &
629 & (
srho(ised,ng)-den(i,k))*cff1
630 END DO
631 den(i,k)=den(i,k)+sedden
632# endif
633 den(i,k)=den(i,k)-1000.0_r8
634# ifdef MASKING
635 den(i,k)=den(i,k)*rmask(i,j)
636# endif
637 END DO
638 END DO
639
640# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET || \
641 defined bulk_fluxes_not_yet
642
643
644
645
646
647
648# ifdef LMD_DDMIX_NOT_YET
650# else
652# endif
653 DO i=istrt,iendt
654 tpr10=0.1_r8*z_r(i,j,k)
655
656
657
658 cff=bulk(i,k)+tpr10
659 cff1=tpr10*den1(i,k)
660 cff2=bulk(i,k)*cff
661 wrk(i,k)=(den(i,k)+1000.0_r8)*cff*cff
662 tcof(i,k)=-(dbulkdt(i,k)*cff1+ &
663 & dden1dt(i,k)*cff2)
664 scof(i,k)= (dbulkds(i,k)*cff1+ &
665 & dden1ds(i,k)*cff2)
666 END DO
667 END DO
668# endif
669
670
671
672
673
674
675
677 DO i=istrt,iendt
678# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET
679# ifdef MASKING
680
681
682 ad_pden(i,j,k)=ad_pden(i,k)*rmask(i,j)
683# endif
684
685
686 ad_den1(i,k)=ad_den1(i,k)+ad_pden(i,j,k)
687 ad_pden(i,j,k)=0.0_r8
688# endif
689
690
691 ad_den(i,k)=ad_den(i,k)+ad_rho(i,j,k)
692 ad_rho(i,j,k)=0.0_r8
693 END DO
694 END DO
695
696# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET || \
697 defined bulk_fluxes_not_yet
698
699
700
701
702
703
704# ifdef LMD_DDMIX_NOT_YET
705
706
708# else
710# endif
712 DO i=istrt,iendt
713 cff=1.0_r8/wrk(i,
n(ng))
714
715
716
717 ad_scof(i,
n(ng))=ad_scof(i,
n(ng))+cff*ad_beta(i,j)
718 ad_tcof(i,
n(ng))=ad_tcof(i,
n(ng))+cff*ad_alpha(i,j)
719 ad_cff=ad_beta(i,j)*scof(i,
n(ng))+ &
720 & ad_alpha(i,j)*tcof(i,
n(ng))
721 ad_beta(i,j)=0.0_r8
722 ad_alpha(i,j)=0.0_r8
723
724
725 ad_wrk(i,
n(ng))=ad_wrk(i,
n(ng))-cff*cff*ad_cff
726 ad_cff=0.0_r8
727 END DO
728 END IF
729 DO i=istrt,iendt
730 tpr10=0.1_r8*z_r(i,j,k)
731 cff=bulk(i,k)+tpr10
732 cff1=tpr10*den1(i,k)
733 cff2=bulk(i,k)*cff
734# ifdef LMD_DDMIX_NOT_YET
735
736
737
738
739 adfac=ad_alfaobeta(i,j,k)/(scof(i,k)*scof(i,k))
740 ad_tcof(i,k)=ad_tcof(i,k)+scof(i,k)*adfac
741 ad_scof(i,k)=ad_scof(i,k)-tcof(i,k)*adfac
742 ad_alfaobeta(i,j,k)=0.0_r8
743# endif
744
745
746
747
748
749 ad_dbulkds(i,k)=ad_dbulkds(i,k)+ad_scof(i,k)*cff1
750 ad_dden1ds(i,k)=ad_dden1ds(i,k)+ad_scof(i,k)*cff2
751 ad_cff1=dbulkds(i,k)*ad_scof(i,k)
752 ad_cff2=dden1ds(i,k)*ad_scof(i,k)
753 ad_scof(i,k)=0.0_r8
754
755
756
757
758
759 ad_dbulkdt(i,k)=ad_dbulkdt(i,k)-ad_tcof(i,k)*cff1
760 ad_dden1dt(i,k)=ad_dden1dt(i,k)-ad_tcof(i,k)*cff2
761 ad_cff1=ad_cff1-dbulkdt(i,k)*ad_tcof(i,k)
762 ad_cff2=ad_cff2-dden1dt(i,k)*ad_tcof(i,k)
763 ad_tcof(i,k)=0.0_r8
764
765
766
767 adfac=cff*ad_wrk(i,k)
768 ad_den(i,k)=ad_den(i,k)+cff*adfac
769 ad_cff=ad_cff+2.0_r8*(den(i,k)+1000.0_r8)*adfac
770 ad_wrk(i,k)=0.0_r8
771
772
773 ad_bulk(i,k)=ad_bulk(i,k)+ad_cff2*cff
774 ad_cff=ad_cff+bulk(i,k)*ad_cff2
775 ad_cff2=0.0_r8
776
777
778 ad_tpr10=ad_tpr10+ad_cff1*den1(i,k)
779 ad_den1(i,k)=ad_den1(i,k)+tpr10*ad_cff1
780 ad_cff1=0.0_r8
781
782
783 ad_bulk(i,k)=ad_bulk(i,k)+ad_cff
784 ad_tpr10=ad_tpr10+ad_cff
785 ad_cff=0.0_r8
786
787
788 ad_z_r(i,j,k)=ad_z_r(i,j,k)+0.1_r8*ad_tpr10
789 ad_tpr10=0.0_r8
790 END DO
791 END DO
792# endif
793
794# if defined BV_FREQUENCY_NOT_YET
795
796
797
798
799
800
801 DO i=istrt,iendt
802
803
804 ad_bvf(i,j,
n(ng))=0.0_r8
805
806
807 ad_bvf(i,j,0)=0.0_r8
808 END DO
810 DO i=istrt,iendt
811 bulk_up=bulk0(i,k+1)- &
812 & z_w(i,j,k)*(bulk1(i,k+1)- &
813 & bulk2(i,k+1)*z_w(i,j,k))
814 bulk_dn=bulk0(i,k )- &
815 & z_w(i,j,k)*(bulk1(i,k )- &
816 & bulk2(i,k )*z_w(i,j,k))
817 cff1=1.0_r8/(bulk_up+0.1_r8*z_w(i,j,k))
818 cff2=1.0_r8/(bulk_dn+0.1_r8*z_w(i,j,k))
819 den_up=cff1*(den1(i,k+1)*bulk_up)
820 den_dn=cff2*(den1(i,k )*bulk_dn)
821 cff3=1.0_r8/(0.5_r8*(den_up+den_dn)* &
822 & (z_r(i,j,k+1)-z_r(i,j,k)))
823
824
825
826 adfac=-
g*ad_bvf(i,j,k)
827 adfac1=adfac*cff3
828 ad_cff3=ad_cff3+(den_up-den_dn)*adfac
829 ad_den_up=ad_den_up+adfac1
830 ad_den_dn=ad_den_dn-adfac1
831 ad_bvf(i,j,k)=0.0_r8
832
833
834
835
836
837
838 adfac=-cff3*cff3*0.5_r8*ad_cff3
839 adfac1=adfac*(z_r(i,j,k+1)-z_r(i,j,k))
840 adfac2=adfac*(den_up+den_dn)
841 ad_z_r(i,j,k )=ad_z_r(i,j,k )-adfac2
842 ad_z_r(i,j,k+1)=ad_z_r(i,j,k+1)+adfac2
843 ad_den_up=ad_den_up+adfac1
844 ad_den_dn=ad_den_dn+adfac1
845 ad_cff3=0.0_r8
846
847
848
849
850
851
852
853 adfac1=cff2*ad_den_dn
854 adfac2=cff1*ad_den_up
855 ad_cff2=ad_cff2+(den1(i,k )*bulk_dn)*ad_den_dn
856 ad_cff1=ad_cff1+(den1(i,k+1)*bulk_up)*ad_den_up
857 ad_den1(i,k )=ad_den1(i,k )+bulk_dn*adfac1
858 ad_den1(i,k+1)=ad_den1(i,k+1)+bulk_up*adfac2
859 ad_bulk_dn=ad_bulk_dn+den1(i,k )*adfac1
860 ad_bulk_up=ad_bulk_up+den1(i,k+1)*adfac2
861 ad_den_dn=0.0_r8
862 ad_den_up=0.0_r8
863
864
865
866 adfac1=-cff2*cff2*ad_cff2
867 adfac2=-cff1*cff1*ad_cff1
868 ad_bulk_dn=ad_bulk_dn+adfac1
869 ad_bulk_up=ad_bulk_up+adfac2
870 ad_z_w(i,j,k)=ad_z_w(i,j,k)+ &
871 & 0.1_r8*(adfac1+adfac2)
872 ad_cff2=0.0_r8
873 ad_cff1=0.0_r8
874
875
876
877
878
879
880
881
882
883
884
885
886
887 adfac1=z_w(i,j,k)*ad_bulk_dn
888 adfac2=z_w(i,j,k)*ad_bulk_up
889 ad_bulk0(i,k )=ad_bulk0(i,k )+ad_bulk_dn
890 ad_bulk0(i,k+1)=ad_bulk0(i,k+1)+ad_bulk_up
891 ad_z_w(i,j,k)=ad_z_w(i,j,k)- &
892 & (bulk1(i,k )- &
893 & bulk2(i,k )*z_w(i,j,k)- &
894 & bulk2(i,k ))*ad_bulk_dn- &
895 & (bulk1(i,k+1)- &
896 & bulk2(i,k+1)*z_w(i,j,k)- &
897 & bulk2(i,k+1))*ad_bulk_up
898 ad_bulk1(i,k )=ad_bulk1(i,k )-adfac1
899 ad_bulk1(i,k+1)=ad_bulk1(i,k+1)-adfac2
900 ad_bulk2(i,k )=ad_bulk2(i,k )+z_w(i,j,k)*adfac1
901 ad_bulk2(i,k+1)=ad_bulk2(i,k+1)+z_w(i,j,k)*adfac2
902 ad_bulk_dn=0.0_r8
903 ad_bulk_up=0.0_r8
904 END DO
905 END DO
906# endif
907
908# ifdef VAR_RHO_2D_NOT_YET
909
910
911
912
913
914
915
916
917
918 DO i=istrt,iendt
919 cff1=den(i,
n(ng))*hz(i,j,
n(ng))
920 rhos1(i,j)=0.5_r8*cff1*hz(i,j,
n(ng))
921 rhoa1(i,j)=cff1
922 END DO
924 DO i=istrt,iendt
925 cff1=den(i,k)*hz(i,j,k)
926 rhos1(i,j)=rhos1(i,j)+hz(i,j,k)*(rhoa1(i,j)+0.5_r8*cff1)
927 rhoa1(i,j)=rhoa1(i,j)+cff1
928 END DO
929 END DO
930
932 DO i=istrt,iendt
933 cff1=1.0_r8/(z_w(i,j,
n(ng))-z_w(i,j,0))
934
935
936
937
938 adfac=2.0_r8*cff2*cff1*ad_rhos(i,j)
939 ad_cff1=2.0_r8*rhos1(i,j)*adfac
940 ad_rhos(i,j)=cff1*adfac
941
942
943 adfac=cff2*ad_rhoa(i,j)
944 ad_cff1=ad_cff1+rhoa1(i,j)*adfac
945 ad_rhoa(i,j)=cff1*adfac
946
947
948 adfac=-cff1*cff1*ad_cff1
949 ad_z_w(i,j,
n(ng))=ad_z_w(i,j,
n(ng))+adfac
950 ad_z_w(i,j,0 )=ad_z_w(i,j,0 )-adfac
951 ad_cff1=0.0_r8
952 END DO
953
954
955
956 DO i=istrt,iendt
957 cff1=den(i,
n(ng))*hz(i,j,
n(ng))
958 rhoa1(i,j)=cff1
959 END DO
961 DO i=istrt,iendt
962 cff1=den(i,k)*hz(i,j,k)
963
964
965 ad_cff1=ad_rhoa(i,j)
966
967
968
969
970 adfac=hz(i,j,k)*ad_rhos(i,j)
971 ad_rhoa(i,j)=ad_rhoa(i,j)+adfac
972 ad_cff1=ad_cff1+0.5_r8*adfac
973 ad_hz(i,j,k)=ad_hz(i,j,k)+ &
974 & (rhoa1(i,j)+0.5_r8*cff1)*ad_rhos(i,j)
975
976
977
978 ad_den(i,k)=ad_den(i,k)+hz(i,j,k)*ad_cff1
979 ad_hz(i,j,k)=ad_hz(i,j,k)+den(i,k)*ad_cff1
980 ad_cff1=0.0_r8
981 rhoa1(i,j)=rhoa1(i,j)+cff1
982 END DO
983 END DO
984 DO i=istrt,iendt
985 cff1=den(i,
n(ng))*hz(i,j,
n(ng))
986
987
988 ad_cff1=ad_rhoa(i,j)
989 ad_rhoa(i,j)=0.0_r8
990
991
992
993 adfac=0.5_r8*ad_rhos(i,j)
994 ad_cff1=ad_cff1+hz(i,j,
n(ng))*adfac
995 ad_hz(i,j,
n(ng))=ad_hz(i,j,
n(ng))+cff1*adfac
996 ad_rhos(i,j)=0.0_r8
997
998
999
1000 ad_den(i,
n(ng))=ad_den(i,
n(ng))+hz(i,j,
n(ng))*ad_cff1
1001 ad_hz(i,j,
n(ng))=ad_hz(i,j,
n(ng))+den(i,
n(ng))*ad_cff1
1002 ad_cff1=0.0_r8
1003 END DO
1004# endif
1005
1006
1007
1008
1009
1011 DO i=istrt,iendt
1012
1013
1014
1015
1016 tt=max(-2.0_r8,t(i,j,k,nrhs,
itemp))
1017# ifdef SALINITY
1018 ts=max(0.0_r8,t(i,j,k,nrhs,
isalt))
1019 sqrtts=sqrt(ts)
1020# else
1021 ts=0.0_r8
1022 sqrtts=0.0_r8
1023# endif
1024 tp=z_r(i,j,k)
1025 tpr10=0.1_r8*tp
1026
1027
1028
1029
1030
1031
1042# ifdef EOS_TDERIVATIVE
1043
1044 dcdt(0)=
q01+tt*(2.0_r8*
q02+tt*(3.0_r8*
q03+tt*(4.0_r8*
q04+ &
1046 dcdt(1)=
u01+tt*(2.0_r8*
u02+tt*(3.0_r8*
u03+tt*4.0_r8*
u04))
1047 dcdt(2)=
v01+tt*2.0_r8*
v02
1048 dcdt(3)=
a01+tt*(2.0_r8*
a02+tt*(3.0_r8*
a03+tt*4.0_r8*
a04))
1049 dcdt(4)=
b01+tt*(2.0_r8*
b02+tt*3.0_r8*
b03)
1050 dcdt(5)=
d01+tt*2.0_r8*
d02
1051 dcdt(6)=
e01+tt*(2.0_r8*
e02+tt*3.0_r8*
e03)
1052 dcdt(7)=
f01+tt*2.0_r8*
f02
1053 dcdt(8)=
g02+tt*2.0_r8*
g03
1054 dcdt(9)=
h01+tt*2.0_r8*
h02
1055
1056 d2cd2t(0)=2.0_r8*
q02+tt*(6.0_r8*
q03+tt*(12.0_r8*
q04+ &
1058 d2cd2t(1)=2.0_r8*
u02+tt*(6.0_r8*
u03+tt*12.0_r8*
u04)
1059 d2cd2t(2)=2.0_r8*
v02
1060 d2cd2t(3)=2.0_r8*
a02+tt*(6.0_r8*
a03+tt*12.0_r8*
a04)
1061 d2cd2t(4)=2.0_r8*
b02+tt*6.0_r8*
b03
1062 d2cd2t(5)=2.0_r8*
d02
1063 d2cd2t(6)=2.0_r8*
e02+tt*6.0_r8*
e03
1064 d2cd2t(7)=2.0_r8*
f02
1065 d2cd2t(8)=2.0_r8*
g03
1066 d2cd2t(9)=2.0_r8*
h02
1067# endif
1068
1069
1070
1071
1072
1073 cff=1.0_r8/(bulk(i,k)+tpr10)
1074# ifdef MASKING
1075
1076
1077 ad_den(i,k)=ad_den(i,k)*rmask(i,j)
1078# endif
1079# if defined SEDIMENT_NOT_YET && defined SED_DENS_NOT_YET
1080
1081
1082 ad_sedden=ad_sedden+ad_den(i,k)
1085 cff1=1.0_r8/
srho(ised,ng)
1086
1087
1088
1089
1090
1091
1092 adfac=cff1*ad_sedden
1093 ad_den(i,k)=ad_den(i,k)- &
1094 & t(i,j,k,nrhs,
idsed(ised))*adfac
1095 ad_t(i,j,k,nrhs,itrc)=ad_t(i,j,k,nrhs,itrc)+ &
1096 & (
srho(ised,ng)-den(i,k))*adfac
1097 END DO
1098
1099
1100 ad_sedden=0.0_r8
1101# endif
1102
1103
1104
1105
1106 adfac1=den1(i,k)*ad_den(i,k)
1107 ad_den1(i,k)=ad_den1(i,k)+bulk(i,k)*cff*ad_den(i,k)
1108 ad_bulk(i,k)=ad_bulk(i,k)+cff*adfac1
1109 ad_cff=ad_cff+bulk(i,k)*adfac1
1110 ad_den(i,k)=0.0_r8
1111
1112
1113 adfac=-cff*cff*ad_cff
1114 ad_bulk(i,k)=ad_bulk(i,k)+adfac
1115 ad_tpr10=ad_tpr10+adfac
1116 ad_cff=0.0_r8
1117
1118# if defined LMD_SKPP_NOT_YET || defined LMD_BKPP_NOT_YET || \
1119 defined bulk_fluxes_not_yet
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136 adfac1=ts*ad_dbulkdt(i,k)
1137 adfac2=tp*ad_dbulkdt(i,k)
1138 adfac3=adfac2*tp
1139 ad_dcdt(3)=ad_dcdt(3)+ad_dbulkdt(i,k)
1140 ad_dcdt(4)=ad_dcdt(4)+adfac1
1141 ad_dcdt(5)=ad_dcdt(5)+sqrtts*adfac1
1142 ad_dcdt(6)=ad_dcdt(6)-adfac2
1143 ad_dcdt(7)=ad_dcdt(7)-ts*adfac2
1144 ad_dcdt(8)=ad_dcdt(8)+adfac3
1145 ad_dcdt(9)=ad_dcdt(9)+ts*adfac3
1146 ad_sqrtts=ad_sqrtts+dcdt(5)*adfac1
1147 ad_ts=ad_ts+ &
1148 & ad_dbulkdt(i,k)* &
1149 & (dcdt(4)+sqrtts*dcdt(5)- &
1150 & tp*(dcdt(7)-tp*dcdt(9)))
1151 ad_tp=ad_tp- &
1152 & ad_dbulkdt(i,k)* &
1153 & (dcdt(6)+ts*dcdt(7)- &
1154 & 2.0_r8*tp*(dcdt(8)+ts*dcdt(9)))
1155 ad_dbulkdt(i,k)=0.0_r8
1156
1157
1158
1159
1160
1161
1162
1163
1164 adfac1=1.5_r8*ad_dbulkds(i,k)
1165 adfac2=tp*ad_dbulkds(i,k)
1166 ad_c(4)=ad_c(4)+ad_dbulkds(i,k)
1167 ad_c(5)=ad_c(5)+sqrtts*adfac1
1168 ad_c(7)=ad_c(7)-adfac2
1169 ad_c(9)=ad_c(9)+tp*adfac2
1170 ad_sqrtts=ad_sqrtts+ &
1171 & (c(5)-tp*
g00)*adfac1
1172 ad_tp=ad_tp- &
1173 & ad_dbulkds(i,k)* &
1174 & (c(7)+sqrtts*1.5_r8*
g00-tp*c(9)- &
1175 & tp*c(9))
1176 ad_dbulkds(i,k)=0.0_r8
1177
1178
1179
1180
1181
1182
1183
1184
1185 ad_tt=ad_tt+d2cd2t(9)*ad_dcdt(9)+ &
1186 & d2cd2t(8)*ad_dcdt(8)+ &
1187 & d2cd2t(7)*ad_dcdt(7)+ &
1188 & d2cd2t(6)*ad_dcdt(6)+ &
1189 & d2cd2t(5)*ad_dcdt(5)+ &
1190 & d2cd2t(4)*ad_dcdt(4)+ &
1191 & d2cd2t(3)*ad_dcdt(3)
1192 ad_dcdt(9)=0.0_r8
1193 ad_dcdt(8)=0.0_r8
1194 ad_dcdt(7)=0.0_r8
1195 ad_dcdt(6)=0.0_r8
1196 ad_dcdt(5)=0.0_r8
1197 ad_dcdt(4)=0.0_r8
1198 ad_dcdt(3)=0.0_r8
1199# endif
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209 adfac=tp*ad_bulk(i,k)
1210 ad_bulk0(i,k)=ad_bulk0(i,k)+ad_bulk(i,k)
1211 ad_bulk1(i,k)=ad_bulk1(i,k)-adfac
1212 ad_bulk2(i,k)=ad_bulk2(i,k)+adfac*tp
1213 ad_tp=ad_tp- &
1214 & ad_bulk(i,k)*(bulk1(i,k)-tp*bulk2(i,k))+ &
1215 & adfac*bulk2(i,k)
1216 ad_bulk(i,k)=0.0_r8
1217
1218
1219 ad_c(8)=ad_c(8)+ad_bulk2(i,k)
1220 ad_c(9)=ad_c(9)+ts*ad_bulk2(i,k)
1221 ad_ts=ad_ts+ad_bulk2(i,k)*c(9)
1222 ad_bulk2(i,k)=0.0_r8
1223
1224
1225
1226
1227 adfac=ts*ad_bulk1(i,k)
1228 ad_c(6)=ad_c(6)+ad_bulk1(i,k)
1229 ad_c(7)=ad_c(7)+adfac
1230 ad_ts=ad_ts+ad_bulk1(i,k)*(c(7)+sqrtts*
g00)
1231 ad_sqrtts=ad_sqrtts+adfac*
g00
1232 ad_bulk1(i,k)=0.0_r8
1233
1234
1235
1236
1237
1238 adfac=ts*ad_bulk0(i,k)
1239 ad_c(3)=ad_c(3)+ad_bulk0(i,k)
1240 ad_c(4)=ad_c(4)+adfac
1241 ad_c(5)=ad_c(5)+sqrtts*adfac
1242 ad_ts=ad_ts+ad_bulk0(i,k)*(c(4)+sqrtts*c(5))
1243 ad_sqrtts=ad_sqrtts+c(5)*adfac
1244 ad_bulk0(i,k)=0.0_r8
1245
1246
1247
1248
1249
1250
1251
1252
1253 ad_tt=ad_tt+ad_c(9)*dcdt(9)+ &
1254 & ad_c(8)*dcdt(8)+ &
1255 & ad_c(7)*dcdt(7)+ &
1256 & ad_c(6)*dcdt(6)+ &
1257 & ad_c(5)*dcdt(5)+ &
1258 & ad_c(4)*dcdt(4)+ &
1259 & ad_c(3)*dcdt(3)
1260 ad_c(9)=0.0_r8
1261 ad_c(8)=0.0_r8
1262 ad_c(7)=0.0_r8
1263 ad_c(6)=0.0_r8
1264 ad_c(5)=0.0_r8
1265 ad_c(4)=0.0_r8
1266 ad_c(3)=0.0_r8
1267
1268# ifdef EOS_TDERIVATIVE
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279 adfac1=ts*ad_dden1dt(i,k)
1280 ad_dcdt(0)=ad_dcdt(0)+ad_dden1dt(i,k)
1281 ad_dcdt(1)=ad_dcdt(1)+adfac1
1282 ad_dcdt(2)=ad_dcdt(2)+sqrtts*adfac1
1283 ad_ts=ad_ts+ &
1284 & (dcdt(1)+sqrtts*dcdt(2))*ad_dden1dt(i,k)
1285 ad_sqrtts=ad_sqrtts+dcdt(2)*adfac1
1286 ad_dden1dt(i,k)=0.0_r8
1287
1288
1289
1290
1291
1292 adfac1=1.5_r8*ad_dden1ds(i,k)
1293 ad_c(1)=ad_c(1)+ad_dden1ds(i,k)
1294 ad_c(2)=ad_c(2)+sqrtts*adfac1
1295 ad_ts=ad_ts+2.0_r8*
w00*ad_dden1ds(i,k)
1296 ad_sqrtts=ad_sqrtts+c(2)*adfac1
1297 ad_dden1ds(i,k)=0.0_r8
1298
1299
1300
1301
1302 ad_tt=ad_tt+d2cd2t(2)*ad_dcdt(2)+ &
1303 & d2cd2t(1)*ad_dcdt(1)+ &
1304 & d2cd2t(0)*ad_dcdt(0)
1305 ad_dcdt(2)=0.0_r8
1306 ad_dcdt(1)=0.0_r8
1307 ad_dcdt(0)=0.0_r8
1308# endif
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318 adfac=ts*ad_den1(i,k)
1319 ad_c(0)=ad_c(0)+ad_den1(i,k)
1320 ad_c(1)=ad_c(1)+adfac
1321 ad_c(2)=ad_c(2)+adfac*sqrtts
1322 ad_ts=ad_ts+ &
1323 & ad_den1(i,k)*(c(1)+sqrtts*c(2)+ts*
w00)+ &
1325 ad_sqrtts=ad_sqrtts+adfac*c(2)
1326 ad_den1(i,k)=0.0_r8
1327
1328
1329
1330
1331 ad_tt=ad_tt+ad_c(2)*dcdt(2)+ &
1332 & ad_c(1)*dcdt(1)+ &
1333 & ad_c(0)*dcdt(0)
1334 ad_c(2)=0.0_r8
1335 ad_c(1)=0.0_r8
1336 ad_c(0)=0.0_r8
1337
1338
1339
1340
1341
1342
1343 ad_tp=ad_tp+0.1_r8*ad_tpr10
1344 ad_tpr10=0.0_r8
1345
1346
1347 ad_z_r(i,j,k)=ad_z_r(i,j,k)+ad_tp
1348 ad_tp=0.0_r8
1349
1350# ifdef SALINITY
1351 IF (ts.ne.0.0_r8) THEN
1352
1353
1354 ad_ts=ad_ts+0.5_r8*ad_sqrtts/sqrt(ts)
1355 ad_sqrtts=0.0_r8
1356 ELSE
1357
1358
1359 ad_sqrtts=0.0_r8
1360 END IF
1361
1362
1363
1364 ad_t(i,j,k,nrhs,
isalt)=ad_t(i,j,k,nrhs,
isalt)+ &
1365 & (0.5_r8-sign(0.5_r8, &
1366 & -t(i,j,k,nrhs,
isalt)))* &
1367 & ad_ts
1368 ad_ts=0.0_r8
1369# else
1370
1371
1372 ad_sqrtts=0.0_r8
1373
1374
1375 ad_ts=0.0_r8
1376# endif
1377
1378
1379
1380 ad_t(i,j,k,nrhs,
itemp)=ad_t(i,j,k,nrhs,
itemp)+ &
1381 & (0.5_r8-sign(0.5_r8,-2.0_r8- &
1382 & t(i,j,k,nrhs,
itemp)))* &
1383 & ad_tt
1384 ad_tt=0.0_r8
1385 END DO
1386 END DO
1387 END DO
1388
1389 RETURN
subroutine ad_exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine ad_exchange_w3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, ad_a)
subroutine ad_exchange_r3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, ad_a)
integer, dimension(:), allocatable n
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
real(r8), dimension(:,:), allocatable srho
integer, dimension(:), allocatable idsed
subroutine ad_mp_exchange3d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)
subroutine ad_mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)