Changeset 160


Ignore:
Timestamp:
06/27/13 15:50:24 (11 years ago)
Author:
dubos
Message:

MPI-aware conservation check

File:
1 edited

Legend:

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

    r151 r160  
    1010  PUBLIC init_check_conserve, check_conserve  
    1111    REAL(rstd),SAVE:: mtot0,ztot0,etot0,ang0,stot0,rmsv0 
    12     REAL(rstd),SAVE::rmsdpdt,etot,ang,stot,rmsv 
    13     REAL(rstd),SAVE:: ztot,mtot 
     12    REAL(rstd),SAVE:: etot,ang,stot,rmsv 
     13    REAL(rstd),SAVE:: ztot 
    1414         
    1515      
     
    3434  USE caldyn_gcm_mod 
    3535  USE exner_mod  
    36   USE mpipara 
     36  USE mpipara, ONLY : is_mpi_root, comm_icosa 
    3737  IMPLICIT NONE 
    3838    TYPE(t_field),POINTER :: f_ps(:) 
     
    4141    TYPE(t_field),POINTER :: f_theta_rhodz(:) 
    4242    TYPE(t_field),POINTER :: f_phis(:) 
    43     INTEGER::it  
     43    INTEGER::it 
     44 
    4445    REAL(rstd),POINTER :: p(:,:),rhodz(:,:)  
    45     INTEGER::ind  
     46    INTEGER::ind,ierr 
     47    REAL(rstd) :: mtot, rmsdpdt 
    4648 
    4749    etot=0.0; ang=0.0;stot=0.0;rmsv=0.0  
    48     mtot=0.0 ; rmsdpdt=0.0 ; ztot = 0.0  
     50    ztot = 0.0  
    4951 
    5052    CALL pression(f_ps,f_p) 
     
    5355      CALL swap_dimensions(ind) 
    5456      CALL swap_geometry(ind) 
    55         p=f_p(ind)  
    56        rhodz=f_rhodz(ind) 
     57      p=f_p(ind)  
     58      rhodz=f_rhodz(ind) 
    5759      CALL compute_rhodz(p,rhodz)  
    58     END DO  
     60    END DO 
    5961 
    6062    CALL vorticity(f_ue,f_vort) 
    61     CALL check_mass_conserve(f_ps,f_dps) 
     63    CALL check_mass_conserve(f_ps,f_dps,mtot,rmsdpdt) 
    6264    CALL check_PV  
    6365    CALL exner(f_ps,f_p,f_pks,f_pk) 
    6466    CALL check_EN(f_ue,f_theta_rhodz,f_phis)  
     67 
     68    IF (is_mpi_root) THEN  
    6569        
    66      IF ( it == 0  ) Then  
    67        ztot0 = ztot 
    68        mtot0 = mtot 
    69        etot0 = etot  
    70        ang0  = ang  
    71        stot0 = stot  
    72      END IF  
    73  
    74      rmsv=SQRT(rmsv/mtot)  
    75      ztot=ztot/ztot0 ; mtot=mtot/mtot0  
    76      etot=etot/etot0 ; ang=ang/ang0 ; stot=stot/stot0  
    77      rmsdpdt= daysec*1.e-2*sqrt(rmsdpdt/ncell_glo)   
    78  
    79  
    80      IF (is_mpi_root) THEN  
     70       IF ( it == 0  ) Then  
     71          ztot0 = ztot 
     72          mtot0 = mtot 
     73          etot0 = etot  
     74          ang0  = ang  
     75          stot0 = stot  
     76       END IF 
     77 
     78       rmsv=SQRT(rmsv/mtot)  
     79       ztot=ztot/ztot0-1. ; mtot=mtot/mtot0-1.  
     80       etot=etot/etot0-1. ; ang=ang/ang0-1. ; stot=stot/stot0-1.  
     81       rmsdpdt= daysec*1.e-2*sqrt(rmsdpdt/ncell_glo)   
     82        
    8183       OPEN(134,file="checkconsicosa.txt",position='append') 
    8284       WRITE(134,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang 
     
    8486       WRITE(134,*)"==================================================" 
    8587       WRITE(*,4000)mtot,rmsdpdt,etot,ztot,stot,rmsv,ang 
    86  
     88        
    87894000   FORMAT(10x,'masse',4x,'rmsdpdt',7x,'energie',2x,'enstrophie'  & 
    88      ,2x,'entropie',3x,'rmsv',4x,'mt.ang',/,'GLOB  '                & 
    89       ,f10.6,e13.6,5f10.3/)      
     90            ,2x,'entropie',3x,'rmsv',4x,'mt.ang',/,'GLOB  '                & 
     91            ,e10.3,e13.6,5e10.3/)      
    9092       close(134)  
    91      END IF  
     93    END IF 
    9294  END SUBROUTINE check_conserve 
    9395   
    9496!--------------------------------------------------------------------- 
    9597 
    96   SUBROUTINE check_mass_conserve(f_ps,f_dps) 
     98  SUBROUTINE check_mass_conserve(f_ps,f_dps,mtot,rmsdpdt) 
     99  USE mpi_mod 
     100  USE mpipara 
    97101  USE icosa 
    98102  IMPLICIT NONE 
     
    100104    TYPE(t_field),POINTER :: f_dps(:) 
    101105    REAL(rstd),POINTER :: ps(:),dps(:)  
     106    REAL(rstd), INTENT(OUT) :: mtot, rmsdpdt 
     107 
    102108    INTEGER :: ind,i,j,ij   
    103  
     109    REAL :: mloc, rmsloc 
     110 
     111    mloc=0.0; rmsloc=0.0 
    104112    DO ind=1,ndomain 
    105113      CALL swap_dimensions(ind) 
     
    111119          ij=(j-1)*iim+i 
    112120          IF (domain(ind)%own(i,j)) THEN 
    113             mtot=mtot+ps(ij)*Ai(ij) 
    114                rmsdpdt=rmsdpdt+dps(ij)*dps(ij) 
     121             mloc=mloc+ps(ij)*Ai(ij) 
     122             rmsloc=rmsloc+dps(ij)*dps(ij) 
    115123          ENDIF 
    116124        ENDDO 
    117125      ENDDO 
    118126    ENDDO 
     127 
     128    CALL MPI_REDUCE(mloc, mtot, 1, MPI_REAL8, MPI_SUM, 0, comm_icosa, ierr) 
     129    CALL MPI_REDUCE(rmsloc, rmsdpdt, 1, MPI_REAL8, MPI_SUM, 0, comm_icosa, ierr) 
     130 
    119131  END SUBROUTINE check_mass_conserve 
    120132 
Note: See TracChangeset for help on using the changeset viewer.