Changeset 128


Ignore:
Timestamp:
02/04/13 11:04:04 (11 years ago)
Author:
dubos
Message:

Energy-conserving TRiSK - tested with JW06 at nbp=80

File:
1 edited

Legend:

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

    r127 r128  
    3131       STOP 
    3232    END SELECT 
     33    PRINT *, 'caldyn_conserv=',def 
    3334 
    3435    def='direct' 
     
    108109    SELECT CASE(caldyn_conserv) 
    109110    CASE(1) ! energy-conserving 
    110     CASE(2) ! enstrophy-conserving 
    111111       DO ind=1,ndomain 
    112112          CALL swap_dimensions(ind) 
    113113          CALL swap_geometry(ind) 
    114            
     114          ps=f_ps(ind) 
     115          rhodz=f_rhodz(ind) 
     116          p=f_p(ind) 
     117          qu=f_qu(ind) 
     118          u=f_u(ind) 
     119          !$OMP PARALLEL DEFAULT(SHARED) 
     120          CALL compute_pvort(ps, u, p,rhodz,qu) 
     121          !$OMP END PARALLEL 
     122       ENDDO 
     123 
     124       CALL transfert_request(f_qu,req_e1) 
     125 
     126       DO ind=1,ndomain 
     127          CALL swap_dimensions(ind) 
     128          CALL swap_geometry(ind) 
    115129          phis=f_phis(ind) 
    116130          ps=f_ps(ind) 
     
    125139          out_u=f_out_u(ind)  
    126140          !$OMP PARALLEL DEFAULT(SHARED) 
    127 !          CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, dps, dtheta_rhodz, du) 
     141          CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, dps, dtheta_rhodz, du) 
     142          !$OMP END PARALLEL 
     143       ENDDO        
     144        
     145    CASE(2) ! enstrophy-conserving 
     146       DO ind=1,ndomain 
     147          CALL swap_dimensions(ind) 
     148          CALL swap_geometry(ind) 
     149          phis=f_phis(ind) 
     150          ps=f_ps(ind) 
     151          dps=f_dps(ind) 
     152          theta_rhodz=f_theta_rhodz(ind) 
     153          dtheta_rhodz=f_dtheta_rhodz(ind) 
     154          rhodz=f_rhodz(ind) 
     155          p=f_p(ind) 
     156          qu=f_qu(ind) 
     157          u=f_u(ind) 
     158          du=f_du(ind) 
     159          out_u=f_out_u(ind)  
     160          !$OMP PARALLEL DEFAULT(SHARED) 
    128161          CALL compute_pvort(ps, u, p,rhodz,qu) 
    129162          CALL compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, dps, dtheta_rhodz, du) 
     
    131164       ENDDO 
    132165        
    133        IF (mod(it,itau_out)==0 ) THEN 
    134           PRINT *,'CALL write_output_fields' 
    135           CALL write_output_fields(f_ps, f_phis, f_dps, f_u, f_theta_rhodz, f_q, & 
    136                f_buf_i, f_buf_v, f_buf_u3d, f_buf_ulon, f_buf_ulat, f_buf_s, f_buf_p) 
    137        END IF 
    138      
    139166    CASE DEFAULT 
    140167       STOP 
    141168    END SELECT 
    142169 
     170    IF (mod(it,itau_out)==0 ) THEN 
     171       PRINT *,'CALL write_output_fields' 
     172       CALL write_output_fields(f_ps, f_phis, f_dps, f_u, f_theta_rhodz, f_q, & 
     173            f_buf_i, f_buf_v, f_buf_u3d, f_buf_ulon, f_buf_ulat, f_buf_s, f_buf_p) 
     174    END IF 
     175     
    143176    !    CALL check_mass_conservation(f_ps,f_dps) 
    144177     
    145178END SUBROUTINE caldyn 
    146    
    147    
     179     
    148180SUBROUTINE compute_pvort(ps, u, p,rhodz,qu) 
    149181  USE icosa 
     
    151183  USE exner_mod 
    152184  IMPLICIT NONE 
    153     REAL(rstd),INTENT(IN)  :: u(iim*3*jjm,llm) 
    154     REAL(rstd),INTENT(IN)  :: ps(iim*jjm) 
    155     REAL(rstd),INTENT(OUT) :: p(iim*jjm,llm+1) 
    156     REAL(rstd),INTENT(OUT) :: rhodz(iim*jjm,llm) 
    157     REAL(rstd),INTENT(OUT) :: qu(iim*3*jjm,llm) 
    158      
    159     INTEGER :: i,j,ij,l 
    160 !    REAL(rstd) :: ww,uu  
    161 !    REAL(rstd) :: delta 
    162     REAL(rstd) :: etav,hv 
    163     REAL(rstd),ALLOCATABLE,SAVE :: qv(:,:)     ! potential velocity   
    164      
    165     LOGICAL,SAVE :: first=.TRUE. 
    166 !$OMP THREADPRIVATE(first) 
    167          
    168 !$OMP BARRIER       
    169 !$OMP MASTER   
    170 !    IF (first) THEN 
    171     ALLOCATE(qv(2*iim*jjm,llm))     ! potential velocity   
    172      
     185  REAL(rstd),INTENT(IN)  :: u(iim*3*jjm,llm) 
     186  REAL(rstd),INTENT(IN)  :: ps(iim*jjm) 
     187  REAL(rstd),INTENT(OUT) :: p(iim*jjm,llm+1) 
     188  REAL(rstd),INTENT(OUT) :: rhodz(iim*jjm,llm) 
     189  REAL(rstd),INTENT(OUT) :: qu(iim*3*jjm,llm) 
     190   
     191  INTEGER :: i,j,ij,l 
     192  REAL(rstd) :: etav,hv 
     193  REAL(rstd),ALLOCATABLE,SAVE :: qv(:,:)     ! potential velocity   
     194   
     195  LOGICAL,SAVE :: first=.TRUE. 
     196  !$OMP THREADPRIVATE(first) 
     197   
     198  !$OMP BARRIER       
     199  !$OMP MASTER   
     200  !    IF (first) THEN 
     201  ALLOCATE(qv(2*iim*jjm,llm))     ! potential velocity   
     202   
    173203!!! Compute pressure 
    174     DO    l    = 1, llm+1 
    175        !$OMP DO 
    176        DO j=jj_begin-1,jj_end+1 
    177           DO i=ii_begin-1,ii_end+1 
    178              ij=(j-1)*iim+i 
    179              p(ij,l) = ap(l) + bp(l) * ps(ij) 
    180           ENDDO 
    181        ENDDO 
    182     ENDDO 
    183      
     204  DO    l    = 1, llm+1 
     205     !$OMP DO 
     206     DO j=jj_begin-1,jj_end+1 
     207        DO i=ii_begin-1,ii_end+1 
     208           ij=(j-1)*iim+i 
     209           p(ij,l) = ap(l) + bp(l) * ps(ij) 
     210        ENDDO 
     211     ENDDO 
     212  ENDDO 
     213   
    184214!!! Compute mass 
    185    DO l = 1, llm 
    186 !$OMP DO 
    187       DO j=jj_begin-1,jj_end+1 
    188          DO i=ii_begin-1,ii_end+1 
    189             ij=(j-1)*iim+i 
    190             rhodz(ij,l) = ( p(ij,l) - p(ij,l+1) )/g 
    191          ENDDO 
    192       ENDDO 
    193    ENDDO 
    194  
     215  DO l = 1, llm 
     216     !$OMP DO 
     217     DO j=jj_begin-1,jj_end+1 
     218        DO i=ii_begin-1,ii_end+1 
     219           ij=(j-1)*iim+i 
     220           rhodz(ij,l) = ( p(ij,l) - p(ij,l+1) )/g 
     221        ENDDO 
     222     ENDDO 
     223  ENDDO 
     224   
    195225!!! Compute shallow-water potential vorticity 
    196226  DO l = 1,llm 
    197227!$OMP DO 
    198228    DO j=jj_begin-1,jj_end+1 
    199       DO i=ii_begin-1,ii_end+1 
    200         ij=(j-1)*iim+i 
    201          
     229       DO i=ii_begin-1,ii_end+1 
     230          ij=(j-1)*iim+i 
     231           
    202232          etav= 1./Av(ij+z_up)*(  ne(ij,rup)        * u(ij+u_rup,l)        * de(ij+u_rup)         & 
    203233                                + ne(ij+t_rup,left) * u(ij+t_rup+u_left,l) * de(ij+t_rup+u_left)  & 
     
    236266!!$OMP BARRIER 
    237267!!$OMP MASTER   
    238     DEALLOCATE(theta)  ! potential temperature 
    239     DEALLOCATE(pk)   ! Exner function 
    240     DEALLOCATE(pks) 
    241     DEALLOCATE(alpha) 
    242     DEALLOCATE(beta) 
    243     DEALLOCATE(phi)    ! geopotential 
    244     DEALLOCATE(Fe)   ! mass flux    
    245     DEALLOCATE(Ftheta) ! theta flux    
    246     DEALLOCATE(convm)    ! mass flux convergence 
    247     DEALLOCATE(w)       ! vertical velocity       
    248268    DEALLOCATE(qv)       ! potential velocity   
    249     DEALLOCATE(berni)   ! bernouilli term 
    250269!!$OMP END MASTER 
    251270!!$OMP BARRIER                                                       
    252271  END SUBROUTINE compute_pvort 
    253272   
    254  
    255 !----------- needed next : rhodz, p --------------! 
    256  
    257273  SUBROUTINE compute_caldyn(ps, u, p,rhodz,qu, phis, theta_rhodz, dps, dtheta_rhodz, du) 
    258274  USE icosa 
     
    284300    REAL(rstd),ALLOCATABLE,SAVE :: convm(:,:)  ! mass flux convergence 
    285301    REAL(rstd),ALLOCATABLE,SAVE :: w(:,:)      ! vertical velocity       
    286     REAL(rstd),ALLOCATABLE,SAVE :: qv(:,:)     ! potential velocity   
    287302    REAL(rstd),ALLOCATABLE,SAVE :: berni(:,:)  ! Bernouilli function 
    288303     
     
    303318    ALLOCATE(convm(iim*jjm,llm))    ! mass flux convergence 
    304319    ALLOCATE(w(iim*jjm,llm))        ! vertical velocity       
    305     ALLOCATE(qv(2*iim*jjm,llm))     ! potential velocity   
    306320    ALLOCATE(berni(iim*jjm,llm))    ! bernouilli term 
    307321 
     
    394408 
    395409!!! Compute potential vorticity (Coriolis) contribution to du 
    396   DO l=1,llm 
    397 !$OMP DO 
    398     DO j=jj_begin,jj_end 
    399       DO i=ii_begin,ii_end 
    400         ij=(j-1)*iim+i 
    401  
    402        du(ij+u_right,l) = qu(ij+u_right,l)/de(ij+u_right) *      &   
    403                       ( wee(ij+u_right,1,1)*Fe(ij+u_rup,l)+                           & 
    404                         wee(ij+u_right,2,1)*Fe(ij+u_lup,l)+                           & 
    405                         wee(ij+u_right,3,1)*Fe(ij+u_left,l)+                          & 
    406                         wee(ij+u_right,4,1)*Fe(ij+u_ldown,l)+                         & 
    407                         wee(ij+u_right,5,1)*Fe(ij+u_rdown,l)+                         &  
    408                         wee(ij+u_right,1,2)*Fe(ij+t_right+u_ldown,l)+                 & 
    409                         wee(ij+u_right,2,2)*Fe(ij+t_right+u_rdown,l)+                 & 
    410                         wee(ij+u_right,3,2)*Fe(ij+t_right+u_right,l)+                 & 
    411                         wee(ij+u_right,4,2)*Fe(ij+t_right+u_rup,l)+                   & 
    412                         wee(ij+u_right,5,2)*Fe(ij+t_right+u_lup,l) ) 
    413  
    414  
    415        du(ij+u_lup,l) = qu(ij+u_lup,l)/de(ij+u_lup) *         &   
    416                       ( wee(ij+u_lup,1,1)*Fe(ij+u_left,l)+                        & 
    417                         wee(ij+u_lup,2,1)*Fe(ij+u_ldown,l)+                       & 
    418                         wee(ij+u_lup,3,1)*Fe(ij+u_rdown,l)+                       & 
    419                         wee(ij+u_lup,4,1)*Fe(ij+u_right,l)+                       & 
    420                         wee(ij+u_lup,5,1)*Fe(ij+u_rup,l)+                         &  
    421                         wee(ij+u_lup,1,2)*Fe(ij+t_lup+u_right,l)+                 & 
    422                         wee(ij+u_lup,2,2)*Fe(ij+t_lup+u_rup,l)+                   & 
    423                         wee(ij+u_lup,3,2)*Fe(ij+t_lup+u_lup,l)+                   & 
    424                         wee(ij+u_lup,4,2)*Fe(ij+t_lup+u_left,l)+                  & 
    425                         wee(ij+u_lup,5,2)*Fe(ij+t_lup+u_ldown,l) ) 
    426  
    427  
    428        du(ij+u_ldown,l) = qu(ij+u_ldown,l)/de(ij+u_ldown) *   &   
    429                       ( wee(ij+u_ldown,1,1)*Fe(ij+u_rdown,l)+                      & 
    430                         wee(ij+u_ldown,2,1)*Fe(ij+u_right,l)+                      & 
    431                         wee(ij+u_ldown,3,1)*Fe(ij+u_rup,l)+                        & 
    432                         wee(ij+u_ldown,4,1)*Fe(ij+u_lup,l)+                        & 
    433                         wee(ij+u_ldown,5,1)*Fe(ij+u_left,l)+                       &  
    434                         wee(ij+u_ldown,1,2)*Fe(ij+t_ldown+u_lup,l)+                & 
    435                         wee(ij+u_ldown,2,2)*Fe(ij+t_ldown+u_left,l)+               & 
    436                         wee(ij+u_ldown,3,2)*Fe(ij+t_ldown+u_ldown,l)+              & 
    437                         wee(ij+u_ldown,4,2)*Fe(ij+t_ldown+u_rdown,l)+              & 
    438                         wee(ij+u_ldown,5,2)*Fe(ij+t_ldown+u_right,l) ) 
    439  
     410 
     411    SELECT CASE(caldyn_conserv) 
     412    CASE(1) ! energy-conserving TRiSK 
     413 
     414       DO l=1,llm 
     415          !$OMP DO 
     416          DO j=jj_begin,jj_end 
     417             DO i=ii_begin,ii_end 
     418                ij=(j-1)*iim+i 
     419 
     420                uu = wee(ij+u_right,1,1)*Fe(ij+u_rup,l)*(qu(ij+u_right,l)+qu(ij+u_rup,l))+                             & 
     421                     wee(ij+u_right,2,1)*Fe(ij+u_lup,l)*(qu(ij+u_right,l)+qu(ij+u_lup,l))+                             & 
     422                     wee(ij+u_right,3,1)*Fe(ij+u_left,l)*(qu(ij+u_right,l)+qu(ij+u_left,l))+                           & 
     423                     wee(ij+u_right,4,1)*Fe(ij+u_ldown,l)*(qu(ij+u_right,l)+qu(ij+u_ldown,l))+                         & 
     424                     wee(ij+u_right,5,1)*Fe(ij+u_rdown,l)*(qu(ij+u_right,l)+qu(ij+u_rdown,l))+                         &  
     425                     wee(ij+u_right,1,2)*Fe(ij+t_right+u_ldown,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_ldown,l))+         & 
     426                     wee(ij+u_right,2,2)*Fe(ij+t_right+u_rdown,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_rdown,l))+         & 
     427                     wee(ij+u_right,3,2)*Fe(ij+t_right+u_right,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_right,l))+         & 
     428                     wee(ij+u_right,4,2)*Fe(ij+t_right+u_rup,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_rup,l))+             & 
     429                     wee(ij+u_right,5,2)*Fe(ij+t_right+u_lup,l)*(qu(ij+u_right,l)+qu(ij+t_right+u_lup,l)) 
     430                du(ij+u_right,l) = .5*uu/de(ij+u_right) 
     431                 
     432                uu = wee(ij+u_lup,1,1)*Fe(ij+u_left,l)*(qu(ij+u_lup,l)+qu(ij+u_left,l)) +                        & 
     433                     wee(ij+u_lup,2,1)*Fe(ij+u_ldown,l)*(qu(ij+u_lup,l)+qu(ij+u_ldown,l)) +                      & 
     434                     wee(ij+u_lup,3,1)*Fe(ij+u_rdown,l)*(qu(ij+u_lup,l)+qu(ij+u_rdown,l)) +                      & 
     435                     wee(ij+u_lup,4,1)*Fe(ij+u_right,l)*(qu(ij+u_lup,l)+qu(ij+u_right,l)) +                      & 
     436                     wee(ij+u_lup,5,1)*Fe(ij+u_rup,l)*(qu(ij+u_lup,l)+qu(ij+u_rup,l)) +                          &  
     437                     wee(ij+u_lup,1,2)*Fe(ij+t_lup+u_right,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_right,l)) +          & 
     438                     wee(ij+u_lup,2,2)*Fe(ij+t_lup+u_rup,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_rup,l)) +              & 
     439                     wee(ij+u_lup,3,2)*Fe(ij+t_lup+u_lup,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_lup,l)) +              & 
     440                     wee(ij+u_lup,4,2)*Fe(ij+t_lup+u_left,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_left,l)) +            & 
     441                     wee(ij+u_lup,5,2)*Fe(ij+t_lup+u_ldown,l)*(qu(ij+u_lup,l)+qu(ij+t_lup+u_ldown,l)) 
     442                du(ij+u_lup,l) = .5*uu/de(ij+u_lup) 
     443 
     444                 
     445                uu = wee(ij+u_ldown,1,1)*Fe(ij+u_rdown,l)*(qu(ij+u_ldown,l)+qu(ij+u_rdown,l)) +                      & 
     446                     wee(ij+u_ldown,2,1)*Fe(ij+u_right,l)*(qu(ij+u_ldown,l)+qu(ij+u_right,l)) +                      & 
     447                     wee(ij+u_ldown,3,1)*Fe(ij+u_rup,l)*(qu(ij+u_ldown,l)+qu(ij+u_rup,l)) +                          & 
     448                     wee(ij+u_ldown,4,1)*Fe(ij+u_lup,l)*(qu(ij+u_ldown,l)+qu(ij+u_lup,l)) +                          & 
     449                     wee(ij+u_ldown,5,1)*Fe(ij+u_left,l)*(qu(ij+u_ldown,l)+qu(ij+u_left,l)) +                        &  
     450                     wee(ij+u_ldown,1,2)*Fe(ij+t_ldown+u_lup,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_lup,l)) +          & 
     451                     wee(ij+u_ldown,2,2)*Fe(ij+t_ldown+u_left,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_left,l)) +        & 
     452                     wee(ij+u_ldown,3,2)*Fe(ij+t_ldown+u_ldown,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_ldown,l)) +      & 
     453                     wee(ij+u_ldown,4,2)*Fe(ij+t_ldown+u_rdown,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_rdown,l)) +      & 
     454                     wee(ij+u_ldown,5,2)*Fe(ij+t_ldown+u_right,l)*(qu(ij+u_ldown,l)+qu(ij+t_ldown+u_right,l)) 
     455                du(ij+u_ldown,l) = .5*uu/de(ij+u_ldown) 
     456                 
     457             ENDDO 
     458          ENDDO 
     459       ENDDO 
     460 
     461    CASE(2) ! enstrophy-conserving TRiSK 
     462   
     463       DO l=1,llm 
     464          !$OMP DO 
     465          DO j=jj_begin,jj_end 
     466             DO i=ii_begin,ii_end 
     467                ij=(j-1)*iim+i 
     468 
     469                uu = wee(ij+u_right,1,1)*Fe(ij+u_rup,l)+                           & 
     470                     wee(ij+u_right,2,1)*Fe(ij+u_lup,l)+                           & 
     471                     wee(ij+u_right,3,1)*Fe(ij+u_left,l)+                          & 
     472                     wee(ij+u_right,4,1)*Fe(ij+u_ldown,l)+                         & 
     473                     wee(ij+u_right,5,1)*Fe(ij+u_rdown,l)+                         &  
     474                     wee(ij+u_right,1,2)*Fe(ij+t_right+u_ldown,l)+                 & 
     475                     wee(ij+u_right,2,2)*Fe(ij+t_right+u_rdown,l)+                 & 
     476                     wee(ij+u_right,3,2)*Fe(ij+t_right+u_right,l)+                 & 
     477                     wee(ij+u_right,4,2)*Fe(ij+t_right+u_rup,l)+                   & 
     478                     wee(ij+u_right,5,2)*Fe(ij+t_right+u_lup,l) 
     479                du(ij+u_right,l) = qu(ij+u_right,l)*uu/de(ij+u_right) 
     480                 
     481                 
     482                uu = wee(ij+u_lup,1,1)*Fe(ij+u_left,l)+                        & 
     483                     wee(ij+u_lup,2,1)*Fe(ij+u_ldown,l)+                       & 
     484                     wee(ij+u_lup,3,1)*Fe(ij+u_rdown,l)+                       & 
     485                     wee(ij+u_lup,4,1)*Fe(ij+u_right,l)+                       & 
     486                     wee(ij+u_lup,5,1)*Fe(ij+u_rup,l)+                         &  
     487                     wee(ij+u_lup,1,2)*Fe(ij+t_lup+u_right,l)+                 & 
     488                     wee(ij+u_lup,2,2)*Fe(ij+t_lup+u_rup,l)+                   & 
     489                     wee(ij+u_lup,3,2)*Fe(ij+t_lup+u_lup,l)+                   & 
     490                     wee(ij+u_lup,4,2)*Fe(ij+t_lup+u_left,l)+                  & 
     491                     wee(ij+u_lup,5,2)*Fe(ij+t_lup+u_ldown,l) 
     492                du(ij+u_lup,l) = qu(ij+u_lup,l)*uu/de(ij+u_lup) 
     493 
     494                uu = wee(ij+u_ldown,1,1)*Fe(ij+u_rdown,l)+                      & 
     495                     wee(ij+u_ldown,2,1)*Fe(ij+u_right,l)+                      & 
     496                     wee(ij+u_ldown,3,1)*Fe(ij+u_rup,l)+                        & 
     497                     wee(ij+u_ldown,4,1)*Fe(ij+u_lup,l)+                        & 
     498                     wee(ij+u_ldown,5,1)*Fe(ij+u_left,l)+                       &  
     499                     wee(ij+u_ldown,1,2)*Fe(ij+t_ldown+u_lup,l)+                & 
     500                     wee(ij+u_ldown,2,2)*Fe(ij+t_ldown+u_left,l)+               & 
     501                     wee(ij+u_ldown,3,2)*Fe(ij+t_ldown+u_ldown,l)+              & 
     502                     wee(ij+u_ldown,4,2)*Fe(ij+t_ldown+u_rdown,l)+              & 
     503                     wee(ij+u_ldown,5,2)*Fe(ij+t_ldown+u_right,l) 
     504                du(ij+u_ldown,l) = qu(ij+u_ldown,l)*uu/de(ij+u_ldown) 
    440505      
    441       ENDDO 
    442     ENDDO 
    443   ENDDO 
     506             ENDDO 
     507          ENDDO 
     508       ENDDO 
     509        
     510    CASE DEFAULT 
     511       STOP 
     512    END SELECT 
    444513   
    445514!!! Compute Exner function 
     
    567636    DEALLOCATE(convm)    ! mass flux convergence 
    568637    DEALLOCATE(w)       ! vertical velocity       
    569     DEALLOCATE(qv)       ! potential velocity   
    570638    DEALLOCATE(berni)   ! bernouilli term 
    571639!!$OMP END MASTER 
Note: See TracChangeset for help on using the changeset viewer.