Changeset 844


Ignore:
Timestamp:
05/03/19 19:16:45 (5 years ago)
Author:
jisesh
Message:

devel: separate module for compute_caldyn_Coriolis

Location:
codes/icosagcm/devel/src/dynamics
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/dynamics/caldyn_hevi.f90

    r842 r844  
    77  USE compute_theta_mod, ONLY : compute_theta 
    88  USE compute_caldyn_kv_mod, ONLY : compute_caldyn_kv 
     9  USE compute_caldyn_Coriolis_mod, ONLY : compute_caldyn_Coriolis 
    910  IMPLICIT NONE 
    1011  PRIVATE 
  • codes/icosagcm/devel/src/dynamics/caldyn_kernels_hevi.F90

    r842 r844  
    1313  LOGICAL, SAVE :: debug_hevi_solver = .FALSE. 
    1414 
    15   PUBLIC :: compute_caldyn_Coriolis, & 
    16        compute_caldyn_slow_hydro, compute_caldyn_slow_NH, & 
     15  PUBLIC :: compute_caldyn_slow_hydro, compute_caldyn_slow_NH, & 
    1716       compute_caldyn_solver, compute_caldyn_fast 
    1817 
     
    434433 
    435434  END SUBROUTINE compute_caldyn_fast 
    436  
    437   SUBROUTINE compute_caldyn_Coriolis(hflux,theta,qu, convm,dtheta_rhodz,du) 
    438     REAL(rstd),INTENT(IN)  :: hflux(3*iim*jjm,llm)  ! hflux in kg/s 
    439     REAL(rstd),INTENT(IN)  :: theta(iim*jjm,llm,nqdyn) ! active scalars 
    440     REAL(rstd),INTENT(IN)  :: qu(3*iim*jjm,llm) 
    441     REAL(rstd),INTENT(OUT) :: convm(iim*jjm,llm)  ! mass flux convergence 
    442     REAL(rstd),INTENT(OUT) :: dtheta_rhodz(iim*jjm,llm,nqdyn) 
    443     REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm) 
    444      
    445     REAL(rstd) :: Ftheta(3*iim*jjm,llm)  ! potential temperature flux 
    446     REAL(rstd) :: uu_right, uu_lup, uu_ldown, du_trisk, divF 
    447     INTEGER :: ij,iq,l,kdown 
    448  
    449     CALL trace_start("compute_caldyn_Coriolis") 
    450  
    451     IF(dysl_caldyn_coriolis) THEN 
    452  
    453 #include "../kernels_hex/coriolis.k90" 
    454  
    455     ELSE 
    456 #define FTHETA(ij) Ftheta(ij,1) 
    457  
    458     DO l=ll_begin, ll_end 
    459        ! compute theta flux 
    460        DO iq=1,nqdyn 
    461        !DIR$ SIMD 
    462           DO ij=ij_begin_ext,ij_end_ext       
    463              FTHETA(ij+u_right) = 0.5*(theta(ij,l,iq)+theta(ij+t_right,l,iq)) & 
    464                                   * hflux(ij+u_right,l) 
    465              FTHETA(ij+u_lup)   = 0.5*(theta(ij,l,iq)+theta(ij+t_lup,l,iq)) & 
    466                   * hflux(ij+u_lup,l) 
    467              FTHETA(ij+u_ldown) = 0.5*(theta(ij,l,iq)+theta(ij+t_ldown,l,iq)) & 
    468                   * hflux(ij+u_ldown,l) 
    469           END DO 
    470           ! horizontal divergence of fluxes 
    471        !DIR$ SIMD 
    472           DO ij=ij_begin,ij_end          
    473              ! dtheta_rhodz =  -div(flux.theta) 
    474              dtheta_rhodz(ij,l,iq)= & 
    475                   -1./Ai(ij)*(ne_right*FTHETA(ij+u_right)    +  & 
    476                   ne_rup*FTHETA(ij+u_rup)        +  &   
    477                   ne_lup*FTHETA(ij+u_lup)        +  &   
    478                   ne_left*FTHETA(ij+u_left)      +  &   
    479                   ne_ldown*FTHETA(ij+u_ldown)    +  & 
    480                   ne_rdown*FTHETA(ij+u_rdown) ) 
    481           END DO 
    482        END DO 
    483  
    484        !DIR$ SIMD 
    485        DO ij=ij_begin,ij_end          
    486           ! convm = -div(mass flux), sign convention as in Ringler et al. 2012, eq. 21 
    487           convm(ij,l)= -1./Ai(ij)*(ne_right*hflux(ij+u_right,l)   +  & 
    488                ne_rup*hflux(ij+u_rup,l)       +  &   
    489                ne_lup*hflux(ij+u_lup,l)       +  &   
    490                ne_left*hflux(ij+u_left,l)     +  &   
    491                ne_ldown*hflux(ij+u_ldown,l)   +  &   
    492                ne_rdown*hflux(ij+u_rdown,l)) 
    493        END DO ! ij 
    494     END DO ! llm 
    495  
    496 !!! Compute potential vorticity (Coriolis) contribution to du 
    497     SELECT CASE(caldyn_conserv) 
    498  
    499     CASE(conserv_energy) ! energy-conserving TRiSK 
    500  
    501        DO l=ll_begin,ll_end 
    502           !DIR$ SIMD 
    503           DO ij=ij_begin,ij_end          
    504              uu_right = & 
    505                   wee(ij+u_right,1,1)*hflux(ij+u_rup,l)*(qu(ij+u_right,l)+qu(ij+u_rup,l))+                             & 
    506                   wee(ij+u_right,2,1)*hflux(ij+u_lup,l)*(qu(ij+u_right,l)+qu(ij+u_lup,l))+                             & 
    507                   wee(ij+u_right,3,1)*hflux(ij+u_left,l)*(qu(ij+u_right,l)+qu(ij+u_left,l))+                           & 
    508                   wee(ij+u_right,4,1)*hflux(ij+u_ldown,l)*(qu(ij+u_right,l)+qu(ij+u_ldown,l))+                         & 
    509                   wee(ij+u_right,5,1)*hflux(ij+u_rdown,l)*(qu(ij+u_right,l)+qu(ij+u_rdown,l))+                         &  
    510                   wee(ij+u_right,1,2)*hflux(ij+t_right+u_ldown,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_ldown,l))+         & 
    511                   wee(ij+u_right,2,2)*hflux(ij+t_right+u_rdown,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_rdown,l))+         & 
    512                   wee(ij+u_right,3,2)*hflux(ij+t_right+u_right,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_right,l))+         & 
    513                   wee(ij+u_right,4,2)*hflux(ij+t_right+u_rup,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_rup,l))+             & 
    514                   wee(ij+u_right,5,2)*hflux(ij+t_right+u_lup,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_lup,l)) 
    515              uu_lup = & 
    516                   wee(ij+u_lup,1,1)*hflux(ij+u_left,l)*(qu(ij+u_lup,l)+qu(ij+u_left,l)) +                        & 
    517                   wee(ij+u_lup,2,1)*hflux(ij+u_ldown,l)*(qu(ij+u_lup,l)+qu(ij+u_ldown,l)) +                      & 
    518                   wee(ij+u_lup,3,1)*hflux(ij+u_rdown,l)*(qu(ij+u_lup,l)+qu(ij+u_rdown,l)) +                      & 
    519                   wee(ij+u_lup,4,1)*hflux(ij+u_right,l)*(qu(ij+u_lup,l)+qu(ij+u_right,l)) +                      & 
    520                   wee(ij+u_lup,5,1)*hflux(ij+u_rup,l)*(qu(ij+u_lup,l)+qu(ij+u_rup,l)) +                          &  
    521                   wee(ij+u_lup,1,2)*hflux(ij+t_lup+u_right,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_right,l)) +          & 
    522                   wee(ij+u_lup,2,2)*hflux(ij+t_lup+u_rup,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_rup,l)) +              & 
    523                   wee(ij+u_lup,3,2)*hflux(ij+t_lup+u_lup,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_lup,l)) +              & 
    524                   wee(ij+u_lup,4,2)*hflux(ij+t_lup+u_left,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_left,l)) +            & 
    525                   wee(ij+u_lup,5,2)*hflux(ij+t_lup+u_ldown,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_ldown,l)) 
    526              uu_ldown = & 
    527                   wee(ij+u_ldown,1,1)*hflux(ij+u_rdown,l)*(qu(ij+u_ldown,l)+qu(ij+u_rdown,l)) +                      & 
    528                   wee(ij+u_ldown,2,1)*hflux(ij+u_right,l)*(qu(ij+u_ldown,l)+qu(ij+u_right,l)) +                      & 
    529                   wee(ij+u_ldown,3,1)*hflux(ij+u_rup,l)*(qu(ij+u_ldown,l)+qu(ij+u_rup,l)) +                          & 
    530                   wee(ij+u_ldown,4,1)*hflux(ij+u_lup,l)*(qu(ij+u_ldown,l)+qu(ij+u_lup,l)) +                          & 
    531                   wee(ij+u_ldown,5,1)*hflux(ij+u_left,l)*(qu(ij+u_ldown,l)+qu(ij+u_left,l)) +                        &  
    532                   wee(ij+u_ldown,1,2)*hflux(ij+t_ldown+u_lup,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_lup,l)) +          & 
    533                   wee(ij+u_ldown,2,2)*hflux(ij+t_ldown+u_left,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_left,l)) +        & 
    534                   wee(ij+u_ldown,3,2)*hflux(ij+t_ldown+u_ldown,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_ldown,l)) +      & 
    535                   wee(ij+u_ldown,4,2)*hflux(ij+t_ldown+u_rdown,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_rdown,l)) +      & 
    536                   wee(ij+u_ldown,5,2)*hflux(ij+t_ldown+u_right,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_right,l)) 
    537              du(ij+u_right,l) = du(ij+u_right,l) + .5*uu_right 
    538              du(ij+u_lup,l)   = du(ij+u_lup,l)   + .5*uu_lup 
    539              du(ij+u_ldown,l) = du(ij+u_ldown,l)   + .5*uu_ldown 
    540           ENDDO 
    541        ENDDO 
    542  
    543     CASE(conserv_gassmann) ! energy-conserving TRiSK modified by Gassmann (2018) 
    544  
    545        DO l=ll_begin,ll_end 
    546           !DIR$ SIMD 
    547           DO ij=ij_begin,ij_end          
    548              uu_right = & 
    549                   wee(ij+u_right,1,1)*hflux(ij+u_rup,l)  *qu(ij+t_right+u_lup,l)+                 & 
    550                   wee(ij+u_right,2,1)*hflux(ij+u_lup,l)  *qu(ij+u_rup,l)+                         & 
    551                 .5*wee(ij+u_right,3,1)*hflux(ij+u_left,l)*(qu(ij+u_right,l)+qu(ij+u_left,l))+     & 
    552                   wee(ij+u_right,4,1)*hflux(ij+u_ldown,l)*qu(ij+u_rdown,l)+                       & 
    553                   wee(ij+u_right,5,1)*hflux(ij+u_rdown,l)*qu(ij+t_right+u_ldown,l)+               & 
    554                   wee(ij+u_right,1,2)*hflux(ij+t_right+u_ldown,l)*qu(ij+u_rdown,l)+               & 
    555                   wee(ij+u_right,2,2)*hflux(ij+t_right+u_rdown,l)*qu(ij+t_right+u_ldown,l)+       & 
    556                .5*wee(ij+u_right,3,2)*hflux(ij+t_right+u_right,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_right,l))+         & 
    557                   wee(ij+u_right,4,2)*hflux(ij+t_right+u_rup,l)*qu(ij+t_right+u_lup,l)+           & 
    558                   wee(ij+u_right,5,2)*hflux(ij+t_right+u_lup,l)*qu(ij+u_rup,l) 
    559              uu_lup = & 
    560                   wee(ij+u_lup,1,1)*hflux(ij+u_left,l)*qu(ij+t_lup+u_ldown,l) +                   & 
    561                   wee(ij+u_lup,2,1)*hflux(ij+u_ldown,l)*qu(ij+u_left,l) +                         & 
    562                .5*wee(ij+u_lup,3,1)*hflux(ij+u_rdown,l)*(qu(ij+u_lup,l)+qu(ij+u_rdown,l)) +       & 
    563                   wee(ij+u_lup,4,1)*hflux(ij+u_right,l)*qu(ij+u_rup,l) +                          & 
    564                   wee(ij+u_lup,5,1)*hflux(ij+u_rup,l)*qu(ij+t_lup+u_right,l)+                     &  
    565                   wee(ij+u_lup,1,2)*hflux(ij+t_lup+u_right,l)*qu(ij+u_rup,l) +                   & 
    566                   wee(ij+u_lup,2,2)*hflux(ij+t_lup+u_rup,l)*qu(ij+t_lup+u_right,l) +              & 
    567                .5*wee(ij+u_lup,3,2)*hflux(ij+t_lup+u_lup,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_lup,l)) + & 
    568                   wee(ij+u_lup,4,2)*hflux(ij+t_lup+u_left,l)*qu(ij+t_lup+u_ldown,l) +            & 
    569                   wee(ij+u_lup,5,2)*hflux(ij+t_lup+u_ldown,l)*qu(ij+u_left,l) 
    570              uu_ldown = & 
    571                   wee(ij+u_ldown,1,1)*hflux(ij+u_rdown,l)*qu(ij+t_ldown,l+u_right) +               & 
    572                   wee(ij+u_ldown,2,1)*hflux(ij+u_right,l)*qu(ij+u_rdown,l) +                       & 
    573                .5*wee(ij+u_ldown,3,1)*hflux(ij+u_rup,l)*(qu(ij+u_ldown,l)+qu(ij+u_rup,l)) +        & 
    574                   wee(ij+u_ldown,4,1)*hflux(ij+u_lup,l)*qu(ij+u_left,l) +                          & 
    575                   wee(ij+u_ldown,5,1)*hflux(ij+u_left,l)*qu(ij+t_ldown+u_lup,l) +                  &  
    576                   wee(ij+u_ldown,1,2)*hflux(ij+t_ldown+u_lup,l)*qu(ij+u_left,l) +                    & 
    577                   wee(ij+u_ldown,2,2)*hflux(ij+t_ldown+u_left,l)*qu(ij+t_ldown+u_lup,l) +          & 
    578                .5*wee(ij+u_ldown,3,2)*hflux(ij+t_ldown+u_ldown,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_ldown,l)) +      & 
    579                   wee(ij+u_ldown,4,2)*hflux(ij+t_ldown+u_rdown,l)*qu(ij+t_ldown+u_right,l) +      & 
    580                   wee(ij+u_ldown,5,2)*hflux(ij+t_ldown+u_right,l)*qu(ij+u_rdown,l) 
    581              du(ij+u_right,l) = du(ij+u_right,l) + uu_right 
    582              du(ij+u_lup,l)   = du(ij+u_lup,l)   + uu_lup 
    583              du(ij+u_ldown,l) = du(ij+u_ldown,l)   + uu_ldown 
    584           ENDDO 
    585        ENDDO 
    586  
    587     CASE(conserv_enstrophy) ! enstrophy-conserving TRiSK 
    588  
    589        DO l=ll_begin,ll_end 
    590           !DIR$ SIMD 
    591           DO ij=ij_begin,ij_end          
    592              uu_right = & 
    593                   wee(ij+u_right,1,1)*hflux(ij+u_rup,l)+                           & 
    594                   wee(ij+u_right,2,1)*hflux(ij+u_lup,l)+                           & 
    595                   wee(ij+u_right,3,1)*hflux(ij+u_left,l)+                          & 
    596                   wee(ij+u_right,4,1)*hflux(ij+u_ldown,l)+                         & 
    597                   wee(ij+u_right,5,1)*hflux(ij+u_rdown,l)+                         &  
    598                   wee(ij+u_right,1,2)*hflux(ij+t_right+u_ldown,l)+                 & 
    599                   wee(ij+u_right,2,2)*hflux(ij+t_right+u_rdown,l)+                 & 
    600                   wee(ij+u_right,3,2)*hflux(ij+t_right+u_right,l)+                 & 
    601                   wee(ij+u_right,4,2)*hflux(ij+t_right+u_rup,l)+                   & 
    602                   wee(ij+u_right,5,2)*hflux(ij+t_right+u_lup,l) 
    603              uu_lup = & 
    604                   wee(ij+u_lup,1,1)*hflux(ij+u_left,l)+                        & 
    605                   wee(ij+u_lup,2,1)*hflux(ij+u_ldown,l)+                       & 
    606                   wee(ij+u_lup,3,1)*hflux(ij+u_rdown,l)+                       & 
    607                   wee(ij+u_lup,4,1)*hflux(ij+u_right,l)+                       & 
    608                   wee(ij+u_lup,5,1)*hflux(ij+u_rup,l)+                         &  
    609                   wee(ij+u_lup,1,2)*hflux(ij+t_lup+u_right,l)+                 & 
    610                   wee(ij+u_lup,2,2)*hflux(ij+t_lup+u_rup,l)+                   & 
    611                   wee(ij+u_lup,3,2)*hflux(ij+t_lup+u_lup,l)+                   & 
    612                   wee(ij+u_lup,4,2)*hflux(ij+t_lup+u_left,l)+                  & 
    613                   wee(ij+u_lup,5,2)*hflux(ij+t_lup+u_ldown,l) 
    614              uu_ldown = & 
    615                   wee(ij+u_ldown,1,1)*hflux(ij+u_rdown,l)+                      & 
    616                   wee(ij+u_ldown,2,1)*hflux(ij+u_right,l)+                      & 
    617                   wee(ij+u_ldown,3,1)*hflux(ij+u_rup,l)+                        & 
    618                   wee(ij+u_ldown,4,1)*hflux(ij+u_lup,l)+                        & 
    619                   wee(ij+u_ldown,5,1)*hflux(ij+u_left,l)+                       &  
    620                   wee(ij+u_ldown,1,2)*hflux(ij+t_ldown+u_lup,l)+                & 
    621                   wee(ij+u_ldown,2,2)*hflux(ij+t_ldown+u_left,l)+               & 
    622                   wee(ij+u_ldown,3,2)*hflux(ij+t_ldown+u_ldown,l)+              & 
    623                   wee(ij+u_ldown,4,2)*hflux(ij+t_ldown+u_rdown,l)+              & 
    624                   wee(ij+u_ldown,5,2)*hflux(ij+t_ldown+u_right,l) 
    625  
    626              du(ij+u_right,l) = du(ij+u_right,l) + uu_right*qu(ij+u_right,l) 
    627              du(ij+u_lup,l)   = du(ij+u_lup,l)   + uu_lup*qu(ij+u_lup,l)      
    628              du(ij+u_ldown,l) = du(ij+u_ldown,l) + uu_ldown*qu(ij+u_ldown,l)  
    629           END DO 
    630        END DO 
    631     CASE DEFAULT 
    632        STOP 
    633     END SELECT 
    634 #undef FTHETA 
    635  
    636     END IF ! dysl 
    637  
    638     CALL trace_end("compute_caldyn_Coriolis") 
    639  
    640   END SUBROUTINE compute_caldyn_Coriolis 
    641435 
    642436  SUBROUTINE compute_caldyn_slow_hydro(u,rhodz,hv, hflux,Kv,du, zero) 
Note: See TracChangeset for help on using the changeset viewer.