Ignore:
Timestamp:
10/19/17 17:04:26 (7 years ago)
Author:
dubos
Message:

trunk : backported commits r582-r598 (transport diagnostics)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/transport/advect_tracer.f90

    r548 r599  
    11MODULE advect_tracer_mod 
    22  USE icosa 
     3  USE advect_mod 
    34  IMPLICIT NONE 
    45  PRIVATE 
     
    2526 
    2627  SUBROUTINE init_advect_tracer 
    27     USE advect_mod 
    2828    USE omp_para 
    2929    REAL(rstd),POINTER :: tangent(:,:) 
     
    5454  END SUBROUTINE init_advect_tracer 
    5555 
    56   SUBROUTINE advect_tracer(f_hfluxt, f_wfluxt,f_u, f_q,f_rhodz) 
    57     USE advect_mod 
    58     USE mpipara 
     56  SUBROUTINE advect_tracer(f_hfluxt, f_wfluxt,f_u, f_q,f_rhodz,& 
     57       frac, f_masst,f_qmasst,f_massfluxt,f_qfluxt) 
     58    USE omp_para 
    5959    USE trace 
    6060    USE write_field_mod 
    6161    USE tracer_mod 
    62     IMPLICIT NONE 
    63      
    6462    TYPE(t_field),POINTER :: f_hfluxt(:)   ! time-integrated horizontal mass flux 
    6563    TYPE(t_field),POINTER :: f_wfluxt(:)   ! time-integrated vertical mass flux 
     
    6765    TYPE(t_field),POINTER :: f_q(:)        ! tracer 
    6866    TYPE(t_field),POINTER :: f_rhodz(:)    ! mass field at beginning of macro time step 
     67    REAL(rstd), INTENT(in):: frac          ! ratio itau_adv/itau_out or 0. if not diagflux_on 
     68    TYPE(t_field),POINTER :: f_masst(:)    ! time-integrated mass 
     69    TYPE(t_field),POINTER :: f_qmasst(:)   ! time-integrated tracer mass 
     70    TYPE(t_field),POINTER :: f_massfluxt(:)! time-integrated horizontal mass flux 
     71    TYPE(t_field),POINTER :: f_qfluxt(:)   ! time-integrated horizontal tracer flux 
    6972 
    7073    REAL(rstd),POINTER :: q(:,:,:), normal(:,:), tangent(:,:), sqrt_leng(:), gradq3d(:,:,:), cc(:,:,:) 
    71     REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:) 
     74    REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:), masst(:,:), qmasst(:,:,:), massfluxt(:,:), qfluxt(:,:,:) 
    7275    REAL(rstd),POINTER :: rhodz(:,:), u(:,:)  
    7376! temporary shared variable for vlz 
     
    7780    REAL(rstd),POINTER ::  wq(:,:)           ! time-integrated flux of q 
    7881     
    79      INTEGER :: ind,k, nq_last 
     82    INTEGER :: ind,k, nq_last 
    8083    LOGICAL,SAVE :: first=.TRUE. 
    8184!$OMP THREADPRIVATE(first) 
     
    141144    CALL send_message(f_cc,req_cc) 
    142145 
    143  
    144146    ! horizontal transport - split in two to place transfer of gradq3d 
    145147    DO k = 1, nqtot 
     
    154156          sqrt_leng=f_sqrt_leng(ind) 
    155157          CALL compute_gradq3d(q(:,:,k),sqrt_leng,gradq3d,xyz_i,xyz_v) 
    156  
    157158        END DO 
    158159 
     
    160161        CALL wait_message(req_cc) 
    161162        CALL wait_message(req_gradq3d) 
    162  
    163163 
    164164        DO ind=1,ndomain 
     
    170170          rhodz   = f_rhodz(ind) 
    171171          hfluxt  = f_hfluxt(ind)  
     172          qfluxt  = f_qfluxt(ind)  
    172173          gradq3d = f_gradq3d(ind) 
    173           CALL compute_advect_horiz(k==nq_last,hfluxt,cc,gradq3d, rhodz,q(:,:,k)) 
     174 
     175          IF(frac>0.) THEN ! accumulate mass, mass flux and tracer mass 
     176             qmasst  = f_qmasst(ind)  
     177             qmasst(:,ll_begin:ll_end,k) = qmasst(:,ll_begin:ll_end,k) + & 
     178                  frac*rhodz(:,ll_begin:ll_end)*q(:,ll_begin:ll_end,k) 
     179             IF(k==nq_last) THEN 
     180                masst  = f_masst(ind) 
     181                massfluxt  = f_massfluxt(ind) 
     182                masst(:,ll_begin:ll_end) = masst(:,ll_begin:ll_end)+frac*rhodz(:,ll_begin:ll_end) 
     183                massfluxt(:,ll_begin:ll_end) = massfluxt(:,ll_begin:ll_end)+hfluxt(:,ll_begin:ll_end) 
     184             END IF 
     185          END IF 
     186          CALL compute_advect_horiz(k==nq_last,frac>0., hfluxt,cc,gradq3d, rhodz, q(:,:,k), qfluxt(:,:,k)) 
    174187        END DO 
     188 
    175189      ENDIF 
    176190    END DO  
     
    214228    USE trace 
    215229    USE omp_para 
    216     IMPLICIT NONE 
    217230    LOGICAL, INTENT(IN)       :: update_mass 
    218231    REAL(rstd), INTENT(IN)    :: fac, wfluxt(iim*jjm,llm+1) ! vertical mass flux 
Note: See TracChangeset for help on using the changeset viewer.