MODULE oce_tam !!---------------------------------------------------------------------- !! This software is governed by the CeCILL licence (Version 2) !!---------------------------------------------------------------------- !!====================================================================== !! *** MODULE oce_tam *** !! NEMOVAR Tangent linear and Adjoint Model variables : !! !! Allocate tangent linear and adjoint fields for the inner loop !! !!====================================================================== !! History of the direct module: !! 8.5 ! 02-11 (G. Madec) F90: Free form and module !! 9.0 ! 05-11 (V. Garnier) Surface pressure gradient organization !! History of the TAM module: !! 9.0 ! 07-07 (K. Mogensen) Initial version !! 9.0 ! 08-03 (A. Vidard) Add variables !! 9.0 ! 09-03 (A. Weaver) Nemo v3 compatible, merge tl_init/ad_init !!---------------------------------------------------------------------- !! oce_tam_init : Allocate and initialize the TAM fields !!---------------------------------------------------------------------- !! * Modules used USE par_kind, ONLY : & ! Precision variables & wp USE par_oce, ONLY : & ! Ocean space and time domain variables & jpi, & & jpj, & & jpk IMPLICIT NONE !! * Routine accessibility PRIVATE PUBLIC & & oce_tam_init, & !: Initialize the TAM fields & oce_tam_deallocate, & !: & ub_tl, & !: Tangent linear of before u-component velocity & un_tl, & !: Tangent linear of now u-component velocity & ua_tl, & !: Tangent linear of after u-component velocity & vb_tl, & !: Tangent linear of before v-component velocity & vn_tl, & !: Tangent linear of now v-component velocity & va_tl, & !: Tangent linear of after v-component velocity & wn_tl, & !: Tangent linear of now w-component velocity & rotb_tl, & !: Tangent linear of now relative vorticity & rotn_tl, & !: Tangent linear of now relative vorticity & hdivb_tl, & !: Tangent linear of before horizontal divergence & hdivn_tl, & !: Tangent linear of now horizontal divergence & tb_tl, & !: Tangent linear of before of temperature & tn_tl, & !: Tangent linear of now temperature & ta_tl, & !: Tangent linear of after temperature & sb_tl, & !: Tangent linear of before salinity & sn_tl, & !: Tangent linear of now salinity & sa_tl, & !: Tangent linear of after salinity & rhd_tl, & !: Tangent linear of Now in situ density anomaly & rhop_tl, & !: Tangent linear of potential volumic mass (kg/m3) & rn2_tl, & !: Tangent linear of Now Brunt-Vaisala frequency !: & spgu_tl, & !: Tangent linear of horizontal surface pressure gradient & spgv_tl, & !: #if defined key_dynspg_rl & bsfb_tl, & !: Tangent linear of before barotropic streamfunction & bsfn_tl, & !: Tangent linear of now barotropic streamfunction & bsfd_tl, & !: Tangent linear of now trend of barotropic streamfunction #else & sshb_tl, & !: Tangent linear of before sea surface height & sshn_tl, & !: Tangent linear of now sea surface height & ssha_tl, & !: Tangent linear of after sea surface height & sshu_tl, & !: Tangent linear of sea surface height at u-point & sshv_tl, & !: Tangent linear of sea surface height at v-point & sshbb_tl, & !: Tangent linear of before before sea surface height #endif & gtu_tl, & !: Tangent Linear of & gsu_tl, & !: & gru_tl, & !: t-, s- and rd horizontal gradient at u- and & gtv_tl, & !: v-points at bottom ocean level & gsv_tl, & !: & grv_tl, & !: !: & ub_ad, & !: Adjoint of before u-component velocity & un_ad, & !: Adjoint of now u-component velocity & ua_ad, & !: Adjoint of after u-component velocity & vb_ad, & !: Adjoint of before v-component velocity & vn_ad, & !: Adjoint of now v-component velocity & va_ad, & !: Adjoint of after v-component velocity & wn_ad, & !: Adjoint of now w-component velocity & rotb_ad, & !: Adjoint of before relative vorticity & rotn_ad, & !: Adjoint of now relative vorticity & hdivb_ad, & !: Adjoint of before horizontal divergence & hdivn_ad, & !: Adjoint of now horizontal divergence & tb_ad, & !: Adjoint of before temperature & tn_ad, & !: Adjoint of now temperature & ta_ad, & !: Adjoint of after temperature & sb_ad, & !: Adjoint of before salinity & sn_ad, & !: Adjoint of now salinity & sa_ad, & !: Adjoint of after salinity & rhd_ad, & !: Adjoint of now in situ density anomaly & rhop_ad, & !: Adjoint of potential volumic mass (kg/m3) & rn2_ad, & !: Adjoint of now Brunt-Vaisala frequency & spgu_ad, & !: Adjoint linear of horizontal surface pressure gradient & spgv_ad, & !: #if defined key_dynspg_rl & bsfb_ad, & !: Adjoint of before barotropic streamfunction & bsfn_ad, & !: Adjoint of now barotropic streamfunction & bsfd_ad, & !: Adjoint of now trend of barotropic streamfunction #else & sshb_ad, & !: Adjoint of before sea surface height & sshn_ad, & !: Adjoint of now sea surface height & ssha_ad, & !: Adjoint of after sea surface height & sshu_ad, & !: Adjoint of sea surface height at u-point & sshv_ad, & !: Adjoint of sea surface height at v-point & sshbb_ad, & !: Adjoint of before before sea surface height #endif & gtu_ad, & !: Adjoint of & gsu_ad, & !: & gru_ad, & !: t-, s- and rd horizontal gradient at u- and & gtv_ad, & !: v-points at bottom ocean level & gsv_ad, & !: & grv_ad #if defined key_zdfddm !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! AW: The declaration/allocation/initialization of these variables !!!! should be moved to a new module zdf_ddm_tam_init to be consistent !!!! with NEMO. PUBLIC & & rrau_tl, & !: Tangent Linear of heat/salt buoyancy flux ratio & rrau_ad !: Adjoint of heat/salt buoyancy flux ratio !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #endif !! * Module variables REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: & & ub_tl, & !: Tangent linear of before u-component velocity & un_tl, & !: Tangent linear of now u-component velocity & ua_tl, & !: Tangent linear of after u-component velocity & vb_tl, & !: Tangent linear of before v-component velocity & vn_tl, & !: Tangent linear of now v-component velocity & va_tl, & !: Tangent linear of after v-component velocity & wn_tl, & !: Tangent linear of now w-component velocity & rotb_tl, & !: Tangent linear of before relative vorticity & rotn_tl, & !: Tangent linear of now relative vorticity & hdivb_tl, & !: Tangent linear of before horizontal divergence & hdivn_tl, & !: Tangent linear of now horizontal divergence & tb_tl, & !: Tangent linear of before temperature & tn_tl, & !: Tangent linear of now temperature & ta_tl, & !: Tangent linear of after temperature & sb_tl, & !: Tangent linear of before salinity & sn_tl, & !: Tangent linear of now salinity & sa_tl, & !: Tangent linear of after salinity & rhd_tl, & !: Tangent linear of now in situ density anomaly & rhop_tl, & !: Tangent linear of potential volumic mass (kg/m3) & rn2_tl !: Tangent linear of now Brunt-Vaisala frequency REAL(KIND=wp), DIMENSION(:,:), ALLOCATABLE :: & & spgu_tl, & !: Tangent of horizontal surface pressure gradient & spgv_tl, & !: #if defined key_dynspg_rl & bsfb_tl, & !: Tangent linear of before barotropic streamfunction & bsfn_tl, & !: Tangent linear of now barotropic streamfunction & bsfd_tl, & !: Tangent linear of now trend of barotropic streamfunction #else & sshb_tl, & !: Tangent linear of before sea surface height & sshn_tl, & !: Tangent linear of now sea surface height & ssha_tl, & !: Tangent linear of after sea surface height & sshu_tl, & !: Tangent linear of sea surface height at u-point & sshv_tl, & !: Tangent linear of sea surface height at v-point & sshbb_tl, & !: Tangent linear of before before sea surface height #endif & gtu_tl, & !: Tangent Linear of & gsu_tl, & !: & gru_tl, & !: t-, s- and rd horizontal gradient at u- and & gtv_tl, & !: v-points at bottom ocean level & gsv_tl, & !: & grv_tl REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: & & ub_ad, & !: Adjoint of before u-component velocity & un_ad, & !: Adjoint of now u-component velocity & ua_ad, & !: Adjoint of after u-component velocity & vb_ad, & !: Adjoint of before v-component velocity & vn_ad, & !: Adjoint of now v-component velocity & va_ad, & !: Adjoint of after v-component velocity & wn_ad, & !: Adjoint of now w-component velocity & rotb_ad, & !: Adjoint of before relative vorticity & rotn_ad, & !: Adjoint of now relative vorticity & hdivb_ad, & !: Adjoint of before horizontal divergence & hdivn_ad, & !: Adjoint of now horizontal divergence & tb_ad, & !: Adjoint of before temperature & tn_ad, & !: Adjoint of now temperature & ta_ad, & !: Adjoint of after temperature & sb_ad, & !: Adjoint of before salinity & sn_ad, & !: Adjoint of now salinity & sa_ad, & !: Adjoint of after salinity & rhd_ad, & !: Adjoint of now in situ density anomaly & rhop_ad, & !: Adjoint of potential volumic mass (kg/m3) & rn2_ad !: Adjoint of now Brunt-Vaisala frequency #if defined key_zdfddm !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! AW: The declaration/allocation/initialization of these variables !!!! should be moved to a new module zdf_ddm_tam_init to be consistent !!!! with NEMO. REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: & & rrau_tl, & !: Tangent Linear of heat/salt buoyancy flux ratio & rrau_ad !: Adjoint of heat/salt buoyancy flux ratio !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #endif REAL(KIND=wp), DIMENSION(:,:), ALLOCATABLE :: & & spgu_ad, & !: Adjoint of horizontal surface pressure gradient & spgv_ad, & !: #if defined key_dynspg_rl & bsfb_ad, & !: Adjoint of before barotropic streamfunction & bsfn_ad, & !: Adjoint of now barotropic streamfunction & bsfd_ad, & !: Adjoint of now trend of barotropic streamfunction #else & sshb_ad, & !: Adjoint of before sea surface height & sshn_ad, & !: Adjoint of now sea surface height & ssha_ad, & !: Adjoint of after sea surface height & sshu_ad, & !: Adjoint of sea surface height at u-point & sshv_ad, & !: Adjoint of sea surface height at v-point & sshbb_ad, & !: Adjoint of before before sea surface height #endif & gtu_ad, & !: Adjoint of & gsu_ad, & !: & gru_ad, & !: t-, s- and rd horizontal gradient at u- and & gtv_ad, & !: v-points at bottom ocean level & gsv_ad, & !: & grv_ad CONTAINS SUBROUTINE oce_tam_init( kindic ) !!----------------------------------------------------------------------- !! !! *** ROUTINE oce_tam_init *** !! !! ** Purpose : Allocate and initialize the tangent linear and !! adjoint arrays !! !! ** Method : kindic = 0 allocate/initialize both tl and ad variables !! kindic = 1 allocate/initialize only tl variables !! kindic = 2 allocate/initialize only ad variables !! !! ** Action : !! !! References : !! !! History : !! ! 07-07 (K. Mogensen) Initial version !! ! 08-07 (A. Vidard) Add missing variables !! ! 08-07 (A. Weaver) Add missing variables !! ! 09-03 (A. Weaver) Combine tl_init/ad_init into oce_tam_init, !! make consistent with oce.F90 in NEMO !! ! 09-03 (A. Vidard) bug fixes on ssh*_ad alloc !!----------------------------------------------------------------------- !! * Arguments INTEGER, INTENT(IN) :: & & kindic ! indicate which variables to allocate/initialize !! * Local declarations ! Allocate tangent linear variable arrays ! --------------------------------------- IF ( kindic == 0 .OR. kindic == 1 ) THEN IF ( .NOT. ALLOCATED(ub_tl) ) THEN ALLOCATE( ub_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(un_tl) ) THEN ALLOCATE( un_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(ua_tl) ) THEN ALLOCATE( ua_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(vb_tl) ) THEN ALLOCATE( vb_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(vn_tl) ) THEN ALLOCATE( vn_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(va_tl) ) THEN ALLOCATE( va_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(wn_tl) ) THEN ALLOCATE( wn_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rotb_tl) ) THEN ALLOCATE( rotb_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rotn_tl) ) THEN ALLOCATE( rotn_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(hdivb_tl) ) THEN ALLOCATE( hdivb_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(hdivn_tl) ) THEN ALLOCATE( hdivn_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(tb_tl) ) THEN ALLOCATE( tb_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(tn_tl) ) THEN ALLOCATE( tn_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(ta_tl) ) THEN ALLOCATE( ta_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(sb_tl) ) THEN ALLOCATE( sb_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(sn_tl) ) THEN ALLOCATE( sn_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(sa_tl) ) THEN ALLOCATE( sa_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rhd_tl) ) THEN ALLOCATE( rhd_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rhop_tl) ) THEN ALLOCATE( rhop_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rn2_tl) ) THEN ALLOCATE( rn2_tl(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(spgu_tl) ) THEN ALLOCATE( spgu_tl(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(spgv_tl) ) THEN ALLOCATE( spgv_tl(jpi,jpj) ) ENDIF #if defined key_dynspg_rl IF ( .NOT. ALLOCATED(bsfb_tl) ) THEN ALLOCATE( bsfb_tl(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(bsfn_tl) ) THEN ALLOCATE( bsfn_tl(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(bsfd_tl) ) THEN ALLOCATE( bsfd_tl(jpi,jpj) ) ENDIF #else IF (.NOT. ALLOCATED(sshb_tl) ) THEN ALLOCATE( sshb_tl(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(sshn_tl) ) THEN ALLOCATE( sshn_tl(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(ssha_tl) ) THEN ALLOCATE( ssha_tl(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(sshu_tl) ) THEN ALLOCATE( sshu_tl(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(sshv_tl) ) THEN ALLOCATE( sshv_tl(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(sshbb_tl) ) THEN ALLOCATE( sshbb_tl(jpi,jpj) ) ENDIF #endif IF ( .NOT. ALLOCATED(gtu_tl) ) THEN ALLOCATE( gtu_tl(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(gtv_tl) ) THEN ALLOCATE( gtv_tl(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(gsu_tl) ) THEN ALLOCATE( gsu_tl(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(gsv_tl) ) THEN ALLOCATE( gsv_tl(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(gru_tl) ) THEN ALLOCATE( gru_tl(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(grv_tl) ) THEN ALLOCATE( grv_tl(jpi,jpj) ) ENDIF #if defined key_zdfddm !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! AW: The declaration/allocation/initialization of these variables !!!! should be moved to a new module zdf_ddm_tam_init to be consistent !!!! with NEMO. IF ( .NOT. ALLOCATED(rrau_tl) ) THEN ALLOCATE( rrau_tl(jpi,jpj,jpk) ) ENDIF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #endif ! Initialize tangent linear variable arrays to zero ! ------------------------------------------------- ub_tl (:,:,:) = 0.0_wp un_tl (:,:,:) = 0.0_wp ua_tl (:,:,:) = 0.0_wp vb_tl (:,:,:) = 0.0_wp vn_tl (:,:,:) = 0.0_wp va_tl (:,:,:) = 0.0_wp wn_tl (:,:,:) = 0.0_wp rotb_tl (:,:,:) = 0.0_wp rotn_tl (:,:,:) = 0.0_wp hdivb_tl(:,:,:) = 0.0_wp hdivn_tl(:,:,:) = 0.0_wp tb_tl (:,:,:) = 0.0_wp tn_tl (:,:,:) = 0.0_wp ta_tl (:,:,:) = 0.0_wp sb_tl (:,:,:) = 0.0_wp sn_tl (:,:,:) = 0.0_wp sa_tl (:,:,:) = 0.0_wp rhd_tl (:,:,:) = 0.0_wp rhop_tl (:,:,:) = 0.0_wp rn2_tl (:,:,:) = 0.0_wp spgu_tl(:,:) = 0.0_wp spgv_tl(:,:) = 0.0_wp #if defined key_dynspg_rl bsfb_tl(:,:) = 0.0_wp bsfn_tl(:,:) = 0.0_wp bsfd_tl(:,:) = 0.0_wp #else sshb_tl(:,:) = 0.0_wp sshn_tl(:,:) = 0.0_wp ssha_tl(:,:) = 0.0_wp sshu_tl(:,:) = 0.0_wp sshv_tl(:,:) = 0.0_wp sshbb_tl(:,:) = 0.0_wp #endif gtu_tl (:,:) = 0.0_wp gsu_tl (:,:) = 0.0_wp gru_tl (:,:) = 0.0_wp gtv_tl (:,:) = 0.0_wp gsv_tl (:,:) = 0.0_wp grv_tl (:,:) = 0.0_wp #if defined key_zdfddm !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! AW: The declaration/allocation/initialization of these variables !!!! should be moved to a new module zdf_ddm_tam_init to be consistent !!!! with NEMO. rrau_tl(:,:,:) = 0.0_wp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #endif ENDIF IF ( kindic == 0 .OR. kindic == 2 ) THEN ! Allocate adjoint variable arrays ! -------------------------------- IF ( .NOT. ALLOCATED(ub_ad) ) THEN ALLOCATE( ub_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(un_ad) ) THEN ALLOCATE( un_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(ua_ad) ) THEN ALLOCATE( ua_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(vb_ad) ) THEN ALLOCATE( vb_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(vn_ad) ) THEN ALLOCATE( vn_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(va_ad) ) THEN ALLOCATE( va_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(wn_ad) ) THEN ALLOCATE( wn_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rotb_ad) ) THEN ALLOCATE( rotb_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rotn_ad) ) THEN ALLOCATE( rotn_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(hdivb_ad) ) THEN ALLOCATE( hdivb_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(hdivn_ad) ) THEN ALLOCATE( hdivn_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(tb_ad) ) THEN ALLOCATE( tb_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(tn_ad) ) THEN ALLOCATE( tn_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(ta_ad) ) THEN ALLOCATE( ta_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(sb_ad) ) THEN ALLOCATE( sb_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(sn_ad) ) THEN ALLOCATE( sn_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(sa_ad) ) THEN ALLOCATE( sa_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rhd_ad) ) THEN ALLOCATE( rhd_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rhop_ad) ) THEN ALLOCATE( rhop_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(rn2_ad) ) THEN ALLOCATE( rn2_ad(jpi,jpj,jpk) ) ENDIF IF ( .NOT. ALLOCATED(spgu_ad) ) THEN ALLOCATE( spgu_ad(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(spgv_ad) ) THEN ALLOCATE( spgv_ad(jpi,jpj) ) ENDIF #if defined key_dynspg_rl IF ( .NOT. ALLOCATED(bsfb_ad) ) THEN ALLOCATE( bsfb_ad(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(bsfn_ad) ) THEN ALLOCATE( bsfn_ad(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(bsfd_ad) ) THEN ALLOCATE( bsfd_ad(jpi,jpj) ) ENDIF #else IF (.NOT. ALLOCATED(sshb_ad) ) THEN ALLOCATE( sshb_ad(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(sshn_ad) ) THEN ALLOCATE( sshn_ad(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(ssha_ad) ) THEN ALLOCATE( ssha_ad(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(sshu_ad) ) THEN ALLOCATE( sshu_ad(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(sshv_ad) ) THEN ALLOCATE( sshv_ad(jpi,jpj) ) ENDIF IF (.NOT. ALLOCATED(sshbb_ad) ) THEN ALLOCATE( sshbb_ad(jpi,jpj) ) ENDIF #endif IF ( .NOT. ALLOCATED(gtu_ad) ) THEN ALLOCATE( gtu_ad(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(gtv_ad) ) THEN ALLOCATE( gtv_ad(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(gsu_ad) ) THEN ALLOCATE( gsu_ad(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(gsv_ad) ) THEN ALLOCATE( gsv_ad(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(gru_ad) ) THEN ALLOCATE( gru_ad(jpi,jpj) ) ENDIF IF ( .NOT. ALLOCATED(grv_ad) ) THEN ALLOCATE( grv_ad(jpi,jpj) ) ENDIF #if defined key_zdfddm !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! AW: The declaration/allocation/initialization of these variables !!!! should be moved to a new module zdf_ddm_tam_init to be consistent !!!! with NEMO. IF ( .NOT. ALLOCATED(rrau_ad) ) THEN ALLOCATE( rrau_ad(jpi,jpj,jpk) ) ENDIF !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #endif ! Initialize adjoint variable arrays to zero ! ------------------------------------------ ub_ad (:,:,:) = 0.0_wp un_ad (:,:,:) = 0.0_wp ua_ad (:,:,:) = 0.0_wp vb_ad (:,:,:) = 0.0_wp vn_ad (:,:,:) = 0.0_wp va_ad (:,:,:) = 0.0_wp wn_ad (:,:,:) = 0.0_wp rotb_ad (:,:,:) = 0.0_wp rotn_ad (:,:,:) = 0.0_wp hdivb_ad(:,:,:) = 0.0_wp hdivn_ad(:,:,:) = 0.0_wp tb_ad (:,:,:) = 0.0_wp tn_ad (:,:,:) = 0.0_wp ta_ad (:,:,:) = 0.0_wp sb_ad (:,:,:) = 0.0_wp sn_ad (:,:,:) = 0.0_wp sa_ad (:,:,:) = 0.0_wp rhd_ad (:,:,:) = 0.0_wp rhop_ad (:,:,:) = 0.0_wp rn2_ad (:,:,:) = 0.0_wp spgu_ad(:,:) = 0.0_wp spgv_ad(:,:) = 0.0_wp #if defined key_dynspg_rl bsfn_ad(:,:) = 0.0_wp bsfb_ad(:,:) = 0.0_wp bsfd_ad(:,:) = 0.0_wp #else sshb_ad(:,:) = 0.0_wp sshn_ad(:,:) = 0.0_wp ssha_ad(:,:) = 0.0_wp sshu_ad(:,:) = 0.0_wp sshv_ad(:,:) = 0.0_wp sshbb_ad(:,:) = 0.0_wp #endif gtu_ad (:,:) = 0.0_wp gsu_ad (:,:) = 0.0_wp gru_ad (:,:) = 0.0_wp gtv_ad (:,:) = 0.0_wp gsv_ad (:,:) = 0.0_wp grv_ad (:,:) = 0.0_wp #if defined key_zdfddm !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! AW: The declaration/allocation/initialization of these variables !!!! should be moved to a new module zdf_ddm_tam_init to be consistent !!!! with NEMO. rrau_ad (:,:,:) = 0.0_wp !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #endif ENDIF END SUBROUTINE oce_tam_init SUBROUTINE oce_tam_deallocate ( kindic ) !!----------------------------------------------------------------------- !! !! *** ROUTINE oce_tam_deallocate *** !! !! ** Purpose : Deallocate the tangent linear and !! adjoint arrays !! !! ** Method : kindic = 0 deallocate both tl and ad variables !! kindic = 1 deallocate only tl variables !! kindic = 2 deallocate only ad variables !! !! ** Action : !! !! References : !! !! History : !! ! 2010-06 (A. Vidard) initial version !!----------------------------------------------------------------------- !! * Arguments INTEGER, INTENT(IN) :: & & kindic ! indicate which variables to allocate/initialize !! * Local declarations ! Dellocate tangent linear variable arrays ! --------------------------------------- IF ( kindic == 0 .OR. kindic == 1 ) THEN IF ( ALLOCATED(ub_tl) ) DEALLOCATE( ub_tl ) IF ( ALLOCATED(un_tl) ) DEALLOCATE( un_tl ) IF ( ALLOCATED(ua_tl) ) DEALLOCATE( ua_tl ) IF ( ALLOCATED(vb_tl) ) DEALLOCATE( vb_tl ) IF ( ALLOCATED(vn_tl) ) DEALLOCATE( vn_tl ) IF ( ALLOCATED(va_tl) ) DEALLOCATE( va_tl ) IF ( ALLOCATED(wn_tl) ) DEALLOCATE( wn_tl ) IF ( ALLOCATED(rotb_tl) ) DEALLOCATE( rotb_tl ) IF ( ALLOCATED(rotn_tl) ) DEALLOCATE( rotn_tl ) IF ( ALLOCATED(hdivb_tl) ) DEALLOCATE( hdivb_tl ) IF ( ALLOCATED(hdivn_tl) ) DEALLOCATE( hdivn_tl ) IF ( ALLOCATED(tb_tl) ) DEALLOCATE( tb_tl ) IF ( ALLOCATED(tn_tl) ) DEALLOCATE( tn_tl ) IF ( ALLOCATED(ta_tl) ) DEALLOCATE( ta_tl ) IF ( ALLOCATED(sb_tl) ) DEALLOCATE( sb_tl ) IF ( ALLOCATED(sn_tl) ) DEALLOCATE( sn_tl ) IF ( ALLOCATED(sa_tl) ) DEALLOCATE( sa_tl ) IF ( ALLOCATED(rhd_tl) ) DEALLOCATE( rhd_tl ) IF ( ALLOCATED(rhop_tl) ) DEALLOCATE( rhop_tl ) IF ( ALLOCATED(rn2_tl) ) DEALLOCATE( rn2_tl ) IF ( ALLOCATED(spgu_tl) ) DEALLOCATE( spgu_tl ) IF ( ALLOCATED(spgv_tl) ) DEALLOCATE( spgv_tl ) #if defined key_dynspg_rl IF ( ALLOCATED(bsfb_tl) ) DEALLOCATE( bsfb_tl ) IF ( ALLOCATED(bsfn_tl) ) DEALLOCATE( bsfn_tl ) IF ( ALLOCATED(bsfd_tl) ) DEALLOCATE( bsfd_tl ) #else IF (ALLOCATED(sshb_tl) ) DEALLOCATE( sshb_tl ) IF (ALLOCATED(sshn_tl) ) DEALLOCATE( sshn_tl ) IF (ALLOCATED(ssha_tl) ) DEALLOCATE( ssha_tl ) IF (ALLOCATED(sshu_tl) ) DEALLOCATE( sshu_tl ) IF (ALLOCATED(sshv_tl) ) DEALLOCATE( sshv_tl ) IF (ALLOCATED(sshbb_tl) ) DEALLOCATE( sshbb_tl ) #endif IF ( ALLOCATED(gtu_tl) ) DEALLOCATE( gtu_tl ) IF ( ALLOCATED(gtv_tl) ) DEALLOCATE( gtv_tl ) IF ( ALLOCATED(gsu_tl) ) DEALLOCATE( gsu_tl ) IF ( ALLOCATED(gsv_tl) ) DEALLOCATE( gsv_tl ) IF ( ALLOCATED(gru_tl) ) DEALLOCATE( gru_tl ) IF ( ALLOCATED(grv_tl) ) DEALLOCATE( grv_tl ) #if defined key_zdfddm !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! AW: The declaration/allocation/initialization of these variables !!!! should be moved to a new module zdf_ddm_tam_init to be consistent !!!! with NEMO. IF ( ALLOCATED(rrau_tl) ) DEALLOCATE( rrau_tl ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #endif ENDIF IF ( kindic == 0 .OR. kindic == 2 ) THEN ! Allocate adjoint variable arrays ! -------------------------------- IF ( ALLOCATED(ub_ad) ) DEALLOCATE( ub_ad ) IF ( ALLOCATED(un_ad) ) DEALLOCATE( un_ad ) IF ( ALLOCATED(ua_ad) ) DEALLOCATE( ua_ad ) IF ( ALLOCATED(vb_ad) ) DEALLOCATE( vb_ad ) IF ( ALLOCATED(vn_ad) ) DEALLOCATE( vn_ad ) IF ( ALLOCATED(va_ad) ) DEALLOCATE( va_ad ) IF ( ALLOCATED(wn_ad) ) DEALLOCATE( wn_ad ) IF ( ALLOCATED(rotb_ad) ) DEALLOCATE( rotb_ad ) IF ( ALLOCATED(rotn_ad) ) DEALLOCATE( rotn_ad ) IF ( ALLOCATED(hdivb_ad) ) DEALLOCATE( hdivb_ad ) IF ( ALLOCATED(hdivn_ad) ) DEALLOCATE( hdivn_ad ) IF ( ALLOCATED(tb_ad) ) DEALLOCATE( tb_ad ) IF ( ALLOCATED(tn_ad) ) DEALLOCATE( tn_ad ) IF ( ALLOCATED(ta_ad) ) DEALLOCATE( ta_ad ) IF ( ALLOCATED(sb_ad) ) DEALLOCATE( sb_ad ) IF ( ALLOCATED(sn_ad) ) DEALLOCATE( sn_ad ) IF ( ALLOCATED(sa_ad) ) DEALLOCATE( sa_ad ) IF ( ALLOCATED(rhd_ad) ) DEALLOCATE( rhd_ad ) IF ( ALLOCATED(rhop_ad) ) DEALLOCATE( rhop_ad ) IF ( ALLOCATED(rn2_ad) ) DEALLOCATE( rn2_ad ) IF ( ALLOCATED(spgu_ad) ) DEALLOCATE( spgu_ad ) IF ( ALLOCATED(spgv_ad) ) DEALLOCATE( spgv_ad ) #if defined key_dynspg_rl IF ( ALLOCATED(bsfb_ad) ) DEALLOCATE( bsfb_ad ) IF ( ALLOCATED(bsfn_ad) ) DEALLOCATE( bsfn_ad ) IF ( ALLOCATED(bsfd_ad) ) DEALLOCATE( bsfd_ad ) #else IF ( ALLOCATED(sshb_ad) ) DEALLOCATE( sshb_ad ) IF ( ALLOCATED(sshn_ad) ) DEALLOCATE( sshn_ad ) IF ( ALLOCATED(ssha_ad) ) DEALLOCATE( ssha_ad ) IF ( ALLOCATED(sshu_ad) ) DEALLOCATE( sshu_ad ) IF ( ALLOCATED(sshv_ad) ) DEALLOCATE( sshv_ad ) IF ( ALLOCATED(sshbb_ad) ) DEALLOCATE( sshbb_ad ) #endif IF ( ALLOCATED(gtu_ad) ) DEALLOCATE( gtu_ad ) IF ( ALLOCATED(gtv_ad) ) DEALLOCATE( gtv_ad ) IF ( ALLOCATED(gsu_ad) ) DEALLOCATE( gsu_ad ) IF ( ALLOCATED(gsv_ad) ) DEALLOCATE( gsv_ad ) IF ( ALLOCATED(gru_ad) ) DEALLOCATE( gru_ad ) IF ( ALLOCATED(grv_ad) ) DEALLOCATE( grv_ad ) #if defined key_zdfddm !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!! AW: The declaration/allocation/initialization of these variables !!!! should be moved to a new module zdf_ddm_tam_init to be consistent !!!! with NEMO. IF ( ALLOCATED(rrau_ad) ) DEALLOCATE( rrau_ad ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #endif ENDIF END SUBROUTINE oce_tam_deallocate END MODULE oce_tam