Ignore:
Timestamp:
10/24/17 01:32:57 (7 years ago)
Author:
dubos
Message:

trunk : backported r600-603 from devel

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/diagnostics/diagflux.F90

    r599 r604  
    1010       f_massfluxt(:), f_qfluxt(:), & ! time-integrated mass flux and tracer flux 
    1111       f_qfluxt_lon(:), f_qfluxt_lat(:), & ! scalar flux reconstructed at cell centers 
    12        f_epot(:), f_ekin(:), f_enthalpy(:), & ! time-averaged potential E, kinetic E and enthalpy 
    13        f_epotfluxt(:), f_ekinfluxt(:), f_enthalpyfluxt(:) ! time averaged 'fluxes' of epot, ekin and enthalpy 
     12       f_ulont(:), f_thetat(:), f_epot(:), f_ekin(:), f_enthalpy(:), & ! time-averaged potential E, kinetic E and enthalpy 
     13       f_ulonfluxt(:), f_thetafluxt(:), f_epotfluxt(:), f_ekinfluxt(:), f_enthalpyfluxt(:) ! time averaged 'fluxes' of epot, ekin and enthalpy 
    1414  LOGICAL :: diagflux_on 
    1515  !$OMP THREADPRIVATE(diagflux_on) 
     
    2626    ll = MERGE(llm,1,diagflux_on) 
    2727    CALL allocate_field(f_masst,         field_t,type_real,ll,       name="masst") 
     28    CALL allocate_field(f_ulont,         field_t,type_real,ll,       name="ulont") 
     29    CALL allocate_field(f_thetat,        field_t,type_real,ll,       name="thetat") 
    2830    CALL allocate_field(f_epot,          field_t,type_real,ll,       name="epot") 
    2931    CALL allocate_field(f_ekin,          field_t,type_real,ll,       name="ekin") 
     
    3133    CALL allocate_field(f_qmasst,        field_t,type_real,ll,nqtot, name="qmasst") 
    3234    CALL allocate_field(f_massfluxt,     field_u,type_real,ll,       name="massfluxt") 
     35    CALL allocate_field(f_ulonfluxt,     field_u,type_real,ll,       name="ulonfluxt") 
     36    CALL allocate_field(f_thetafluxt,    field_u,type_real,ll,       name="thetafluxt") 
    3337    CALL allocate_field(f_epotfluxt,     field_u,type_real,ll,       name="epotfluxt") 
    3438    CALL allocate_field(f_ekinfluxt,     field_u,type_real,ll,       name="ekinfluxt") 
     
    5054       CALL swap_dimensions(ind) 
    5155       ZERO2(f_masst) 
     56       ZERO2(f_ulont) 
     57       ZERO2(f_thetat) 
    5258       ZERO2(f_epot) 
    5359       ZERO2(f_ekin) 
     
    5561       ZERO3(f_qmasst) 
    5662       ZERO2(f_massfluxt) 
     63       ZERO2(f_ulonfluxt) 
     64       ZERO2(f_thetafluxt) 
    5765       ZERO2(f_epotfluxt) 
    5866       ZERO2(f_ekinfluxt) 
     
    110118!------------------------------------ Compute energy fluxes --------------------------------------- 
    111119 
    112   SUBROUTINE diagflux_energy(frac, f_phis,f_rhodz,f_theta_rhodz,f_u, f_geopot,f_theta, f_hfluxt) 
     120  SUBROUTINE diagflux_energy(frac, f_phis,f_rhodz,f_theta_rhodz,f_u, f_geopot,f_theta,f_pk, f_hfluxt) 
    113121    REAL(rstd), INTENT(IN) :: frac 
    114     TYPE(t_field),POINTER :: f_phis(:),f_rhodz(:),f_theta_rhodz(:),f_u(:), f_geopot(:), f_theta(:), f_hfluxt(:) 
     122    TYPE(t_field),POINTER :: f_phis(:),f_rhodz(:),f_theta_rhodz(:),f_u(:), f_geopot(:), f_theta(:), f_pk(:), f_hfluxt(:) 
    115123    REAL(rstd), POINTER :: phis(:), rhodz(:,:), theta_rhodz(:,:,:), u(:,:), & 
    116          geopot(:,:), pk(:,:,:), hfluxt(:,:), & 
    117          epot(:,:), ekin(:,:), enthalpy(:,:), & 
    118          epotflux(:,:), ekinflux(:,:), enthalpyflux(:,:) 
     124         geopot(:,:), theta(:,:,:), pk(:,:), hfluxt(:,:), & 
     125         ulont(:,:), thetat(:,:), epot(:,:), ekin(:,:), enthalpy(:,:), & 
     126         thetaflux(:,:), ulonflux(:,:), epotflux(:,:), ekinflux(:,:), enthalpyflux(:,:) 
    119127    INTEGER :: ind 
    120128    DO ind=1,ndomain 
     
    128136       u = f_u(ind) 
    129137       geopot = f_geopot(ind) 
    130        pk = f_theta(ind) ! buffer 
     138       theta = f_theta(ind) ! buffer 
     139       pk = f_pk(ind) ! buffer 
     140       ulont = f_ulont(ind) 
     141       thetat = f_thetat(ind) 
    131142       epot = f_epot(ind) 
    132143       ekin = f_ekin(ind) 
    133144       enthalpy = f_enthalpy(ind) 
     145       ulonflux = f_ulonfluxt(ind) 
     146       thetaflux = f_thetafluxt(ind) 
    134147       epotflux = f_epotfluxt(ind) 
    135148       ekinflux = f_ekinfluxt(ind) 
    136149       enthalpyflux = f_enthalpyfluxt(ind) 
    137        CALL compute_diagflux_energy(frac,hfluxt, phis,rhodz,theta_rhodz,u, geopot,pk, epot,ekin,enthalpy, epotflux, ekinflux, enthalpyflux) 
     150       CALL compute_diagflux_energy(frac,hfluxt, phis,rhodz,theta_rhodz,u, geopot,theta,pk, & 
     151            ulont, thetat, epot, ekin, enthalpy, & 
     152            ulonflux, thetaflux, epotflux, ekinflux, enthalpyflux) 
    138153    END DO 
    139154  END SUBROUTINE diagflux_energy 
    140155 
    141   SUBROUTINE compute_diagflux_energy(frac, massflux, phis,rhodz,theta_rhodz,u, geopot,pk, epot,ekin,enthalpy, epot_flux, ekin_flux, enthalpy_flux) 
     156  SUBROUTINE compute_diagflux_energy(frac, massflux, phis,rhodz,theta_rhodz,ue, geopot,theta,pk, & 
     157       ulon, thetat, epot, ekin, enthalpy, & 
     158       ulon_flux, thetat_flux, epot_flux, ekin_flux, enthalpy_flux) 
    142159    USE disvert_mod, ONLY : ptop 
    143160    REAL(rstd), INTENT(IN) :: frac 
    144     REAL(rstd), INTENT(IN) :: massflux(3*iim*jjm,llm), u(3*iim*jjm,llm),& 
     161    REAL(rstd), INTENT(IN) :: massflux(3*iim*jjm,llm), ue(3*iim*jjm,llm),& 
    145162                              phis(iim*jjm), rhodz(iim*jjm,llm), theta_rhodz(iim*jjm,llm,nqtot) 
    146     REAL(rstd), INTENT(INOUT) :: geopot(iim*jjm,llm+1), pk(iim*jjm,llm) ! pk = buffer 
    147     REAL(rstd), INTENT(INOUT), DIMENSION(iim*jjm, llm)   ::  epot, ekin, enthalpy 
    148     REAL(rstd), INTENT(INOUT), DIMENSION(3*iim*jjm, llm) ::  epot_flux, ekin_flux, enthalpy_flux     
    149     REAL(rstd) :: energy, p_ik, theta_ik, temp_ik, gv, Rd  
     163    REAL(rstd), INTENT(INOUT) :: geopot(iim*jjm,llm+1), theta(iim*jjm,llm), pk(iim*jjm,llm) ! theta,pk = buffers 
     164    REAL(rstd), INTENT(INOUT), DIMENSION(iim*jjm, llm)   ::  ulon, thetat, epot, ekin, enthalpy 
     165    REAL(rstd), INTENT(INOUT), DIMENSION(3*iim*jjm, llm) ::  ulon_flux, thetat_flux, epot_flux, ekin_flux, enthalpy_flux     
     166    REAL(rstd) :: energy, p_ik, theta_ik, temp_ik, gv, Rd, cx,cy,cz, ux,uy,uz, ue_le,ulon_i 
    150167    INTEGER :: ij, l, ij_omp_begin_ext, ij_omp_end_ext 
    151168    Rd = kappa*cpp 
    152169    ! even if loops are of the _ext variant, we still need halo exchanges before reconstructing fluxes at cell centers 
    153170    ! => loop over interior region 
    154     CALL distrib_level(ij_end-ij_begin+1,ij_omp_begin_ext,ij_omp_end_ext) 
    155     ij_omp_begin_ext = ij_omp_begin_ext+ij_begin-1 
    156     ij_omp_end_ext = ij_omp_end_ext+ij_begin-1 
     171    CALL distrib_level(ij_begin_ext, ij_end_ext, ij_omp_begin_ext,ij_omp_end_ext) 
    157172#include "../kernels/energy_fluxes.k90" 
    158173  END SUBROUTINE compute_diagflux_energy 
Note: See TracChangeset for help on using the changeset viewer.