Ignore:
Timestamp:
06/13/19 16:45:43 (5 years ago)
Author:
adurocher
Message:

trunk : Check tracer mass conservation in check_conserve

Location:
codes/icosagcm/trunk/src
Files:
2 edited

Legend:

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

    r899 r902  
    1717       AAM_mass_source(3), AAM_vel_source(3) ! read/written only IF is_master 
    1818  REAL(rstd),SAVE :: AAM_vel_plus_source(3), AAM_vel_minus_source(3) 
    19   REAL(rstd),SAVE :: mtot0,ztot0,etot0,angtot0,stot0 
     19  REAL(rstd),SAVE :: mtot0,mqtot0,ztot0,etot0,angtot0,stot0 
    2020  !$OMP THREADPRIVATE(check_type, mtot0,ztot0,etot0,angtot0,stot0) 
    2121   
     
    5151!--------------------------------- Basic check -------------------------------- 
    5252 
    53   SUBROUTINE check_conserve(f_ps,f_dps,f_ue,f_theta_rhodz,f_phis,it)  
     53  SUBROUTINE check_conserve(f_ps,f_dps,f_ue,f_theta_rhodz,f_phis,f_q,it)  
    5454  USE pression_mod 
    5555  USE vorticity_mod 
     
    6363    TYPE(t_field),POINTER :: f_theta_rhodz(:) 
    6464    TYPE(t_field),POINTER :: f_phis(:) 
     65    TYPE(t_field),POINTER :: f_q(:) 
    6566    INTEGER, INTENT(IN) :: it 
    6667 
    6768    REAL(rstd),POINTER :: p(:,:),rhodz(:,:)  
    6869    INTEGER :: ind 
    69     REAL(rstd) :: mtot, angtot, rmsdpdt 
     70    REAL(rstd) :: mtot, mqtot, angtot, rmsdpdt 
    7071    REAL(rstd) :: etot, stot, ang_mass, ang_vel, ang_velp, ang_velm, rmsvtot, ztot 
    7172 
     
    8384 
    8485    CALL vorticity(f_ue,f_vort) 
     86    CALL check_qmass_conserve(f_q,f_rhodz,mqtot) 
    8587    CALL check_mass_conserve(f_ps,f_dps,mtot,rmsdpdt) 
    8688    CALL check_PV(ztot)  
     
    98100          ztot0 = ztot 
    99101          mtot0 = mtot 
     102          mqtot0 = mqtot 
    100103          etot0 = etot  
    101104          angtot0  = angtot 
     
    111114       END IF 
    112115       rmsvtot=SQRT(rmsvtot/mtot)  
    113        ztot=ztot/ztot0-1. ; mtot=mtot/mtot0-1.  
     116       ztot=ztot/ztot0-1. ; mtot=mtot/mtot0-1. 
     117       mqtot=(mqtot+1E-100)/(mqtot0+1e-100)-1. 
    114118       etot=etot/etot0-1. ; angtot=angtot/angtot0-1. ; stot=stot/stot0-1.  
    115119       rmsdpdt= daysec*1.e-2*sqrt(rmsdpdt/ncell_glo)   
    116120        
    117121       OPEN(134,file="checkconsicosa.txt",position='append') 
    118        WRITE(134,4000)mtot,rmsdpdt,etot,ztot,stot,rmsvtot,angtot 
    119        WRITE(134,*)mtot,rmsdpdt,etot,ztot,stot,rmsvtot,angtot  
     122       WRITE(134,4000)mtot,mqtot,rmsdpdt,etot,ztot,stot,rmsvtot,angtot 
     123       WRITE(134,*)mtot,mqtot,rmsdpdt,etot,ztot,stot,rmsvtot,angtot  
    120124       WRITE(134,*)"==================================================" 
    121        WRITE(*,4000)mtot,rmsdpdt,etot,ztot,stot,rmsvtot,angtot 
     125       WRITE(*,4000)mtot,mqtot,rmsdpdt,etot,ztot,stot,rmsvtot,angtot 
    122126        
    123 4000   FORMAT(10x,'masse',5x,'rmsdpdt',5x,'energie',5x,'enstrophie'  & 
     1274000   FORMAT(10x,'masse',5x,'advec mass',5x,'rmsdpdt',6x,'energie',3x,'enstrophie'  & 
    124128            ,5x,'entropie',5x,'rmsv',5x,'mt.ang',/,'GLOB  '          & 
    125             ,e10.3,e13.6,5e13.3/)      
     129            ,2e10.3,e13.5,5e13.3/)      
    126130       CLOSE(134) 
    127131 
     
    269273  END SUBROUTINE check_mass_conserve 
    270274 
     275  SUBROUTINE check_qmass_conserve(f_q,f_rhodz,mqtot) 
     276  USE mpi_mod 
     277  USE mpipara 
     278  USE transfert_omp_mod 
     279  USE omp_para 
     280  IMPLICIT NONE 
     281    TYPE(t_field),POINTER :: f_q(:) 
     282    TYPE(t_field),POINTER :: f_rhodz(:) 
     283    REAL(rstd),POINTER :: q(:,:,:)  
     284    REAL(rstd),POINTER :: rhodz(:,:)  
     285    REAL(rstd), INTENT(OUT) :: mqtot 
     286 
     287    INTEGER :: ind,i,j,ij,l  
     288    REAL :: mloc 
     289 
     290    mloc=0.0 
     291    DO ind=1,ndomain 
     292      IF (.NOT. assigned_domain(ind) .OR. .NOT. is_omp_level_master) CYCLE 
     293      CALL swap_dimensions(ind) 
     294      CALL swap_geometry(ind) 
     295      q=f_q(ind) 
     296      rhodz=f_rhodz(ind) 
     297      DO j=jj_begin,jj_end 
     298        DO i=ii_begin,ii_end 
     299          ij=(j-1)*iim+i 
     300          IF (domain(ind)%own(i,j)) THEN 
     301            DO l=1, llm 
     302             mloc=mloc + sum( q(ij,l,:)*Ai(ij)*rhodz(ij,l) ) 
     303            END DO 
     304          ENDIF 
     305        ENDDO 
     306      ENDDO 
     307    ENDDO 
     308     
     309    CALL global_sum(mloc, mqtot) 
     310  END SUBROUTINE check_qmass_conserve 
     311 
    271312!--------------------------------------------------------------------- 
    272313 
  • codes/icosagcm/trunk/src/time/timeloop_gcm.f90

    r899 r902  
    228228    END IF 
    229229 
    230     CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,itau0)   
     230    CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,f_q,itau0)   
    231231 
    232232    Call trace_on 
     
    362362          CALL check_conserve_detailed(it, AAM_dyn, & 
    363363               f_ps,f_dps,f_u,f_theta_rhodz,f_phis) 
    364           CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it)  
     364          CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,f_q,it)  
    365365       ENDIF 
    366366 
     
    379379    CALL check_conserve_detailed(it, AAM_dyn, & 
    380380         f_ps,f_dps,f_u,f_theta_rhodz,f_phis) 
    381     CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,it)   
     381    CALL check_conserve(f_ps,f_dps,f_u,f_theta_rhodz,f_phis,f_q,it)   
    382382     
    383383    !$OMP MASTER 
Note: See TracChangeset for help on using the changeset viewer.