Changeset 592


Ignore:
Timestamp:
10/17/17 23:11:14 (7 years ago)
Author:
dubos
Message:

devel : finalize diagnostics of tracer fluxes

Location:
codes/icosagcm/devel/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/diagnostics/diagflux.f90

    r590 r592  
    44  SAVE 
    55   
    6   TYPE(t_field),POINTER :: f_qfluxt(:), f_qfluxt_lon(:), f_qfluxt_lat(:) ! time-integrated flux of scalars and its reconstruction at cell centers 
     6  TYPE(t_field),POINTER :: & 
     7       f_masst(:), f_qmasst(:), & ! time-integrated mass, tracer mass,  
     8       f_massfluxt(:), f_qfluxt(:), & ! mass flux and tracer flux 
     9       f_qfluxt_lon(:), f_qfluxt_lat(:) ! scalar flux reconstructed  cell centers 
    710  LOGICAL :: diagflux_on 
    811  !$OMP THREADPRIVATE(diagflux_on) 
     
    1518    CALL getin("diagflux", diagflux_on) 
    1619    IF(diagflux_on) THEN 
     20       CALL allocate_field(f_masst,  field_t,type_real,llm, name="masst") 
     21       CALL allocate_field(f_qmasst,  field_t,type_real,llm,nqtot, name="qmasst") 
     22       CALL allocate_field(f_massfluxt, field_u,type_real,llm, name="massfluxt") 
    1723       CALL allocate_field(f_qfluxt,  field_u,type_real,llm,nqtot, name="qfluxt") 
    1824       CALL allocate_field(f_qfluxt_lon,  field_t,type_real,llm,nqtot, name="qfluxt_lon") 
     
    2026       CALL zero_qfluxt 
    2127    ELSE 
     28       CALL allocate_field(f_masst,  field_t,type_real,0, name="masst") 
     29       CALL allocate_field(f_qmasst,  field_t,type_real,llm,0, name="qmasst") 
     30       CALL allocate_field(f_massfluxt, field_u,type_real,0, name="massfluxt") 
    2231       CALL allocate_field(f_qfluxt,  field_u,type_real,llm,0, name="qfluxt") 
    2332       CALL allocate_field(f_qfluxt_lon,  field_t,type_real,llm,0, name="qfluxt_lon") 
     
    3039    USE omp_para 
    3140    INTEGER :: ind 
    32     REAL(rstd), POINTER :: qfluxt(:,:,:) 
     41    REAL(rstd), POINTER :: buf2(:,:),buf3(:,:,:) 
    3342    DO ind=1,ndomain 
    3443       IF (.NOT. assigned_domain(ind)) CYCLE 
    3544       CALL swap_dimensions(ind) 
    36        qfluxt=f_qfluxt(ind) 
    37        qfluxt(:,ll_begin:ll_end,:)=0. 
     45       buf2=f_masst(ind) 
     46       buf2(:,ll_begin:ll_end)=0. 
     47       buf2=f_massfluxt(ind) 
     48       buf2(:,ll_begin:ll_end)=0. 
     49       buf3=f_qmasst(ind) 
     50       buf3(:,ll_begin:ll_end,:)=0. 
     51       buf3=f_qfluxt(ind) 
     52       buf3(:,ll_begin:ll_end,:)=0. 
    3853    END DO 
    3954  END SUBROUTINE zero_qfluxt 
    4055 
    41   SUBROUTINE flux_centered_lonlat(scale, f_flux, f_flux_lon, f_flux_lat) 
     56  SUBROUTINE flux_centered_lonlat(scale, f_massflux, f_flux, f_massflux_lon, f_massflux_lat, f_flux_lon, f_flux_lat) 
    4257    REAL(rstd), INTENT(IN) :: scale 
    43     TYPE(t_field),POINTER :: f_flux(:), f_flux_lon(:), f_flux_lat(:) 
    44     REAL(rstd), POINTER :: flux(:,:,:), flux_lon(:,:,:), flux_lat(:,:,:) 
     58    TYPE(t_field),POINTER :: f_flux(:), f_flux_lon(:), f_flux_lat(:), & 
     59         f_massflux(:), f_massflux_lon(:), f_massflux_lat(:) 
     60    REAL(rstd), POINTER :: flux(:,:,:), flux_lon(:,:,:), flux_lat(:,:,:), & 
     61         massflux(:,:), massflux_lon(:,:), massflux_lat(:,:) 
    4562    INTEGER :: ind, itrac 
    4663    DO ind=1,ndomain 
     
    5471          CALL compute_flux_centered_lonlat(scale, flux(:,:,itrac), flux_lon(:,:,itrac), flux_lat(:,:,itrac)) 
    5572       END DO 
     73       massflux=f_massflux(ind) 
     74       massflux_lon=f_massflux_lon(ind) 
     75       massflux_lat=f_massflux_lat(ind) 
     76       CALL compute_flux_centered_lonlat(scale, massflux, massflux_lon, massflux_lat) 
    5677    END DO 
    5778  END SUBROUTINE flux_centered_lonlat 
  • codes/icosagcm/devel/src/diagnostics/observable.f90

    r588 r592  
    163163    IF(.NOT. init) THEN 
    164164       IF(diagflux_on) THEN 
    165           CALL flux_centered_lonlat(1./(itau_out*dt) , f_qfluxt, f_qfluxt_lon, f_qfluxt_lat) 
     165          CALL output_field("mass_t", f_masst) 
     166          CALL output_field("qmass_t", f_qmasst) 
     167          CALL flux_centered_lonlat(1./(itau_out*dt) , f_massfluxt, f_qfluxt, & 
     168               f_buf_ulon, f_buf_ulat, f_qfluxt_lon, f_qfluxt_lat) 
     169          CALL output_field("massflux_lon",f_buf_ulon) 
     170          CALL output_field("massflux_lat",f_buf_ulat) 
    166171          CALL output_field("qflux_lon",f_qfluxt_lon) 
    167172          CALL output_field("qflux_lat",f_qfluxt_lat) 
  • codes/icosagcm/devel/src/time/timeloop_gcm.f90

    r584 r592  
    182182    REAL(rstd),POINTER :: rhodz(:,:), mass(:,:), ps(:) 
    183183 
    184     INTEGER :: ind 
    185     INTEGER :: it,i,j,l,n,  stage 
    186     LOGICAL :: fluxt_zero(ndomain) ! set to .TRUE. to start accumulating fluxes in time 
     184    REAL(rstd) :: adv_over_out ! ratio itau_adv/itau_out 
     185    INTEGER :: ind, it,i,j,l,n,  stage 
     186    LOGICAL :: fluxt_zero(ndomain) ! set to .TRUE. to start accumulating mass fluxes in time 
    187187    LOGICAL, PARAMETER :: check_rhodz=.FALSE. 
    188188    INTEGER :: start_clock, stop_clock, rate_clock 
     
    211211 
    212212    IF(positive_theta) CALL copy_theta_to_q(f_theta_rhodz,f_rhodz,f_q) 
     213    IF(diagflux_on) THEN 
     214       adv_over_out = itau_adv*(1./itau_out) 
     215    ELSE 
     216       adv_over_out = 0. 
     217    END IF 
    213218 
    214219    CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,itau0)   
     
    299304        
    300305       IF(MOD(it,itau_adv)==0) THEN 
    301           CALL advect_tracer(diagflux_on, f_hfluxt,f_wfluxt,f_u, f_q,f_rhodz,f_qfluxt)  ! update q and rhodz after RK step 
     306          CALL advect_tracer(f_hfluxt,f_wfluxt,f_u, f_q,f_rhodz, & ! update q and rhodz after RK step 
     307               adv_over_out, f_masst,f_qmasst,f_massfluxt, f_qfluxt)  ! accumulate mass and fluxes if diagflux_on 
    302308          fluxt_zero=.TRUE. 
    303309          ! FIXME : check that rhodz is consistent with ps 
  • codes/icosagcm/devel/src/transport/advect_tracer.f90

    r583 r592  
    5454  END SUBROUTINE init_advect_tracer 
    5555 
    56   SUBROUTINE advect_tracer(diagflux_on, f_hfluxt, f_wfluxt,f_u, f_q,f_rhodz,f_qfluxt) 
    57     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 
    5859    USE trace 
    5960    USE write_field_mod 
    6061    USE tracer_mod 
    61     LOGICAL, INTENT(IN) :: diagflux_on 
    6262    TYPE(t_field),POINTER :: f_hfluxt(:)   ! time-integrated horizontal mass flux 
    6363    TYPE(t_field),POINTER :: f_wfluxt(:)   ! time-integrated vertical mass flux 
     
    6565    TYPE(t_field),POINTER :: f_q(:)        ! tracer 
    6666    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 
    6771    TYPE(t_field),POINTER :: f_qfluxt(:)   ! time-integrated horizontal tracer flux 
    6872 
    6973    REAL(rstd),POINTER :: q(:,:,:), normal(:,:), tangent(:,:), sqrt_leng(:), gradq3d(:,:,:), cc(:,:,:) 
    70     REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:), qfluxt(:,:,:) 
     74    REAL(rstd),POINTER :: hfluxt(:,:), wfluxt(:,:), masst(:,:), qmasst(:,:,:), massfluxt(:,:), qfluxt(:,:,:) 
    7175    REAL(rstd),POINTER :: rhodz(:,:), u(:,:)  
    7276! temporary shared variable for vlz 
     
    7680    REAL(rstd),POINTER ::  wq(:,:)           ! time-integrated flux of q 
    7781     
    78      INTEGER :: ind,k, nq_last 
     82    INTEGER :: ind,k, nq_last 
    7983    LOGICAL,SAVE :: first=.TRUE. 
    8084!$OMP THREADPRIVATE(first) 
     
    140144    CALL send_message(f_cc,req_cc) 
    141145 
    142  
    143146    ! horizontal transport - split in two to place transfer of gradq3d 
    144147    DO k = 1, nqtot 
     
    153156          sqrt_leng=f_sqrt_leng(ind) 
    154157          CALL compute_gradq3d(q(:,:,k),sqrt_leng,gradq3d,xyz_i,xyz_v) 
    155  
    156158        END DO 
    157159 
     
    159161        CALL wait_message(req_cc) 
    160162        CALL wait_message(req_gradq3d) 
    161  
    162163 
    163164        DO ind=1,ndomain 
     
    171172          qfluxt  = f_qfluxt(ind)  
    172173          gradq3d = f_gradq3d(ind) 
    173           CALL compute_advect_horiz(k==nq_last,diagflux_on, hfluxt,cc,gradq3d, rhodz,q(:,:,k),qfluxt(:,:,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  
Note: See TracChangeset for help on using the changeset viewer.