Ignore:
Timestamp:
08/03/18 16:53:37 (6 years ago)
Author:
dubos
Message:

devel : backported from trunk commits r607,r648,r649,r667,r668,r669,r706

File:
1 edited

Legend:

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

    r609 r714  
    1414   
    1515  REAL(rstd),SAVE :: AAM_mass, AAM_mass_old, AAM_vel, AAM_vel_old, & 
     16       AAM_velp, AAM_velp_old, AAM_velm, AAM_velm_old, & 
    1617       AAM_mass_source(3), AAM_vel_source(3) ! read/written only IF is_master 
     18  REAL(rstd),SAVE :: AAM_vel_plus_source(3), AAM_vel_minus_source(3) 
    1719  REAL(rstd),SAVE :: mtot0,ztot0,etot0,angtot0,stot0,rmsvtot0 
    1820  !$OMP THREADPRIVATE(check_type, mtot0,ztot0,etot0,angtot0,stot0,rmsvtot0) 
     
    6668    INTEGER :: ind,ierr 
    6769    REAL(rstd) :: mtot, angtot, rmsdpdt 
    68     REAL(rstd) :: etot, stot, ang_mass, ang_vel, rmsvtot, ztot 
     70    REAL(rstd) :: etot, stot, ang_mass, ang_vel, ang_velp, ang_velm, rmsvtot, ztot 
    6971 
    7072    CALL transfert_request(f_ue,req_e1_vect) 
     
    8486    CALL check_PV(ztot)  
    8587    CALL exner(f_ps,f_p,f_pks,f_pk) 
    86     CALL check_energy(f_ue,f_theta_rhodz,f_phis, etot, stot, ang_mass, ang_vel, rmsvtot)  
     88    CALL check_energy(f_ue,f_theta_rhodz,f_phis, etot, stot, ang_mass, ang_vel, ang_velp, ang_velm, rmsvtot)  
    8789 
    8890    IF (is_master) THEN ! is_master = is_omp_master && is_mpi_master 
     
    9092       AAM_mass = ang_mass 
    9193       AAM_vel = ang_vel 
     94       AAM_velp = ang_velp 
     95       AAM_velm = ang_velm 
    9296       angtot  = ang_mass + ang_vel 
    9397       IF ( it == itau0  ) THEN  
     
    99103          AAM_mass_old=AAM_mass 
    100104          AAM_vel_old=AAM_vel 
     105          AAM_velp_old=AAM_velp 
     106          AAM_velm_old=AAM_velm 
    101107          AAM_mass_source=0. 
    102108          AAM_vel_source=0. 
     109          AAM_vel_plus_source=0. 
     110          AAM_vel_minus_source=0. 
    103111       END IF 
    104112       rmsvtot=SQRT(rmsvtot/mtot)  
     
    127135          WRITE(*,'(A,6E12.4)') 'AAM_vel  : time,old,new,dissip,dyn,phys', dt*it, AAM_vel_old, AAM_vel, & 
    128136               AAM_vel_source(AAM_dissip), AAM_vel_source(AAM_dyn), AAM_vel_source(AAM_phys) 
    129           WRITE(*,'(A,6E12.4)') 'AAM_tot  : time,old,new,dissip,dyn,phys', dt*it, & 
    130                AAM_vel_old+AAM_mass_old, AAM_vel+AAM_mass, & 
    131                AAM_vel_source(AAM_dissip)+AAM_mass_source(AAM_dissip), & 
    132                AAM_vel_source(AAM_dyn)   +AAM_mass_source(AAM_dyn), & 
    133                AAM_vel_source(AAM_phys)  +AAM_mass_source(AAM_phys) 
     137          WRITE(*,'(A,6E12.4)') 'AAM_vel+ : time,old,new,dissip,dyn,phys', dt*it, AAM_velp_old, AAM_velp, & 
     138               AAM_vel_plus_source(AAM_dissip), AAM_vel_plus_source(AAM_dyn), AAM_vel_plus_source(AAM_phys) 
     139          WRITE(*,'(A,6E12.4)') 'AAM_vel- : time,old,new,dissip,dyn,phys', dt*it, AAM_velm_old, AAM_velm, & 
     140               AAM_vel_minus_source(AAM_dissip), AAM_vel_minus_source(AAM_dyn), AAM_vel_minus_source(AAM_phys) 
     141          WRITE(*,'(A,6E12.4)') 'AAM_dyn budget mass + vel:', AAM_mass_source(AAM_dyn) + AAM_vel_source(AAM_dyn) 
    134142          AAM_mass_old=AAM_mass 
    135143          AAM_vel_old=AAM_vel 
     144          AAM_velp_old=AAM_velp 
     145          AAM_velm_old=AAM_velm 
    136146          AAM_mass_source=0. 
    137147          AAM_vel_source=0. 
     148          AAM_vel_minus_source=0. 
     149          AAM_vel_plus_source=0. 
    138150       END IF 
    139151    END IF 
     
    160172    REAL(rstd),POINTER :: p(:,:),rhodz(:,:)  
    161173    INTEGER::ind,ierr 
    162     REAL(rstd) :: mtot, ztot, rmsdpdt, etot,stot,rmsv, ang_mass, ang_vel 
     174    REAL(rstd) :: mtot, ztot, rmsdpdt, etot,stot,rmsv, ang_mass, ang_vel, ang_velp, ang_velm 
    163175     
    164176    IF(check_type == check_detailed) THEN 
     
    175187       END DO 
    176188       CALL exner(f_ps,f_p,f_pks,f_pk) 
    177        CALL check_energy(f_ue,f_theta_rhodz,f_phis, etot, stot, ang_mass, ang_vel, rmsv)  
     189       CALL check_energy(f_ue,f_theta_rhodz,f_phis, etot, stot, ang_mass, ang_vel, ang_velp, ang_velm, rmsv)  
    178190        
    179191       IF (is_master) THEN 
     
    186198          AAM_mass_source(tag) = AAM_mass_source(tag) + ang_mass - AAM_mass 
    187199          AAM_vel_source(tag) = AAM_vel_source(tag) + ang_vel - AAM_vel 
     200          AAM_vel_plus_source(tag) = AAM_vel_plus_source(tag) + ang_velp - AAM_velp 
     201          AAM_vel_minus_source(tag) = AAM_vel_minus_source(tag) + ang_velm - AAM_velm 
     202          !if ((ang_vel - AAM_vel) .gt. 0.) then 
     203          !  AAM_vel_plus_source(tag) = AAM_vel_plus_source(tag) + ang_vel - AAM_vel 
     204          !else 
     205          !  AAM_vel_minus_source(tag) = AAM_vel_minus_source(tag) + ang_vel - AAM_vel 
     206          !endif 
    188207          AAM_mass = ang_mass 
    189208          AAM_vel = ang_vel 
     209          AAM_velp = ang_velp 
     210          AAM_velm = ang_velm 
    190211       END IF 
    191212    END IF 
     
    252273 
    253274  SUBROUTINE check_energy(f_ue,f_theta_rhodz,f_phis, etot, & 
    254                       stot, AAM_mass_tot, AAM_vel_tot, rmsvtot)   
     275                      stot, AAM_mass_tot, AAM_vel_tot, AAM_velp_tot, AAM_velm_tot, rmsvtot)   
    255276  USE pression_mod 
    256277  USE vorticity_mod 
     
    258279    TYPE(t_field), POINTER :: f_theta_rhodz(:) 
    259280    TYPE(t_field), POINTER :: f_phis(:) 
    260     REAL(rstd),INTENT(OUT) :: etot, stot, AAM_mass_tot, AAM_vel_tot, rmsvtot 
     281    REAL(rstd),INTENT(OUT) :: etot, stot, AAM_mass_tot, AAM_vel_tot, AAM_velp_tot, AAM_velm_tot, rmsvtot 
    261282    REAL(rstd), POINTER :: ue(:,:) 
    262283    REAL(rstd), POINTER :: p(:,:)  
     
    265286    REAL(rstd), POINTER :: phis(:)  
    266287    REAL(rstd), POINTER :: rhodz(:,:)  
    267     REAL(rstd) :: e, s, AAM_mass, AAM_vel, rmsv 
     288    REAL(rstd) :: e, s, AAM_mass, AAM_vel, AAM_velp, AAM_velm, rmsv 
    268289    INTEGER :: ind 
    269290 
    270291    e = 0 ; s = 0 ; AAM_mass = 0 ; AAM_vel=0 ; rmsv = 0 
     292    AAM_velp = 0 ; AAM_velm = 0 
    271293 
    272294    DO ind=1,ndomain  
     
    281303      phis=f_phis(ind)  
    282304      CALL compute_energy(ind,ue,p,rhodz,theta_rhodz(:,:,1),pk,phis, & 
    283            e, s, AAM_mass, AAM_vel, rmsv) 
     305           e, s, AAM_mass, AAM_vel, AAM_velp, AAM_velm, rmsv) 
    284306    END DO  
    285307 
     
    289311    CALL global_sum(AAM_mass, AAM_mass_tot) 
    290312    CALL global_sum(AAM_vel, AAM_vel_tot) 
     313    CALL global_sum(AAM_velp, AAM_velp_tot) 
     314    CALL global_sum(AAM_velm, AAM_velm_tot) 
    291315  END SUBROUTINE check_energy 
    292316 
    293   SUBROUTINE compute_energy(ind,u,p,rhodz,theta_rhodz,pk,phis, e, s, AAM_mass, AAM_vel, rmsv) 
     317  SUBROUTINE compute_energy(ind,u,p,rhodz,theta_rhodz,pk,phis, e, s, AAM_mass, AAM_vel, AAM_velp, AAM_velm, rmsv) 
    294318    USE disvert_mod 
    295319    USE wind_mod 
     
    302326    REAL(rstd),INTENT(IN) :: pk(iim*jjm,llm) 
    303327    REAL(rstd),INTENT(IN) :: phis(iim*jjm) 
    304     REAL(rstd),INTENT(INOUT) :: e, s, AAM_mass, AAM_vel, rmsv 
     328    REAL(rstd),INTENT(INOUT) :: e, s, AAM_mass, AAM_vel, AAM_velp, AAM_velm, rmsv 
    305329     
    306330    REAL(rstd) :: ucenter(iim*jjm,llm,3) 
     
    335359                AAM_mass = AAM_mass + rad*cos(lat)*mass_ij*radomeg*cos(lat) 
    336360                AAM_vel  = AAM_vel  + rad*cos(lat)*mass_ij*ulon(ij,l) 
     361                if (ulon(ij,l) > 0.) then 
     362                  AAM_velp  = AAM_velp  + rad*cos(lat)*mass_ij*ulon(ij,l) 
     363                else 
     364                  AAM_velm  = AAM_velm  + rad*cos(lat)*mass_ij*ulon(ij,l) 
     365                endif 
    337366             END IF 
    338367          END DO 
Note: See TracChangeset for help on using the changeset viewer.