Skip to content
Snippets Groups Projects
crsdom.F90 112 KiB
Newer Older
Guillaume Samson's avatar
Guillaume Samson committed
!!$              nis0all_crs(jj) = nis0all_crs(jn)
!!$              nimppt_crs (jj) = nimppt_crs (jn)
!!$           ENDDO
!!$         ENDDO 
!!$        
!!$         Nie0_crs  = nie0all_crs(narea) 
!!$         jpi_crs   = jpiall_crs (narea)
!!$         Nis0_crs  = nis0all_crs(narea)
!!$         nimpp_crs = nimppt_crs (narea)
!!$
!!$         DO ji = 1, jpi_crs
!!$            mig_crs(ji) = ji + nimpp_crs - 1
!!$         ENDDO
!!$         DO jj = 1, jpj_crs
!!$            mjg_crs(jj) = jj + njmpp_crs - 1!
!!$         ENDDO
!!$       
!!$         DO ji = 1, jpiglo_crs
!!$            mi0_crs(ji) = MAX( 1, MIN( ji - nimpp_crs + 1 , jpi_crs + 1 ) )
!!$            mi1_crs(ji) = MAX( 0, MIN( ji - nimpp_crs + 1 , jpi_crs     ) )
!!$         ENDDO
!!$         
!!$         DO jj = 1, jpjglo_crs
!!$            mj0_crs(jj) = MAX( 1, MIN( jj - njmpp_crs + 1 , jpj_crs + 1 ) )
!!$            mj1_crs(jj) = MAX( 0, MIN( jj - njmpp_crs + 1 , jpj_crs     ) )
!!$         ENDDO
!!$
!!$      ENDIF
!!$      
!!$      !                         Save the parent grid information
!!$      jpi_full    = jpi
!!$      jpj_full    = jpj
!!$      jpim1_full  = jpim1
!!$      jpjm1_full  = jpjm1
!!$      nperio_full = jperio
!!$
!!$      npolj_full  = npolj
!!$      jpiglo_full = jpiglo
!!$      jpjglo_full = jpjglo
!!$
!!$      jpj_full   = jpj
!!$      jpi_full   = jpi
!!$      Nis0_full  = Nis0
!!$      Njs0_full  = Njs0
!!$      Nie0_full  = Nie0
!!$      Nje0_full  = Nje0
!!$      nimpp_full = nimpp     
!!$      njmpp_full = njmpp
!!$      
!!$      jpiall_full (:) = jpiall (:)
!!$      nis0all_full(:) = nis0all(:)
!!$      nie0all_full(:) = nie0all(:)
!!$      nimppt_full (:) = nimppt (:)
!!$      jpjall_full (:) = jpjall (:)
!!$      njs0all_full(:) = njs0all(:)
!!$      nje0all_full(:) = nje0all(:)
!!$      njmppt_full (:) = njmppt (:)
      
      CALL dom_grid_crs  !swich de grille
     

      IF(lwp) THEN
         WRITE(numout,*)
         WRITE(numout,*) 'crs_init : coarse grid dimensions'
         WRITE(numout,*) '~~~~~~~   coarse domain global j-dimension           jpjglo = ', jpjglo
         WRITE(numout,*) '~~~~~~~   coarse domain global i-dimension           jpiglo = ', jpiglo
         WRITE(numout,*) '~~~~~~~   coarse domain local  i-dimension              jpi = ', jpi
         WRITE(numout,*) '~~~~~~~   coarse domain local  j-dimension              jpj = ', jpj
         WRITE(numout,*)
         WRITE(numout,*) ' narea  = '     , narea
         WRITE(numout,*) ' jpi    = '     , jpi
         WRITE(numout,*) ' jpj    = '     , jpj
         WRITE(numout,*) ' Nis0   = '     , Nis0
         WRITE(numout,*) ' Njs0   = '     , Njs0
         WRITE(numout,*) ' Nie0   = '     , Nie0
         WRITE(numout,*) ' Nje0   = '     , Nje0
         WRITE(numout,*) ' Nie0_full='    , Nie0_full
         WRITE(numout,*) ' Nis0_full='    , Nis0_full
         WRITE(numout,*) ' nimpp  = '     , nimpp
         WRITE(numout,*) ' njmpp  = '     , njmpp
         WRITE(numout,*) ' njmpp_full  = ', njmpp_full
         WRITE(numout,*)
      ENDIF
      
      CALL dom_grid_glo
      
      mxbinctr   = INT( nn_factx * 0.5 )
      mybinctr   = INT( nn_facty * 0.5 )

      nrestx = MOD( nn_factx, 2 )   ! check if even- or odd- numbered reduction factor
      nresty = MOD( nn_facty, 2 )

      IF ( nrestx == 0 ) THEN
         mxbinctr = mxbinctr - 1
      ENDIF

      IF ( nresty == 0 ) THEN
         mybinctr = mybinctr - 1
!!$         IF ( jperio == 3 .OR. jperio == 4 )  nperio_crs = jperio + 2
!!$         IF ( jperio == 5 .OR. jperio == 6 )  nperio_crs = jperio - 2 
!!$
!!$         IF ( npolj == 3 ) npolj_crs = 5
!!$         IF ( npolj == 5 ) npolj_crs = 3
      ENDIF     
      
      rfactxy = nn_factx * nn_facty
      
      ! 2.b. Set up bins for coarse grid, horizontal only.
      ierr = crs_dom_alloc2()
     
      mis2_crs(:) = 0      ;      mie2_crs(:) = 0
      mjs2_crs(:) = 0      ;      mje2_crs(:) = 0

      
      SELECT CASE ( nn_binref )

      CASE ( 0 ) 

!!$         SELECT CASE ( jperio )
!!$     
!!$ 
!!$        CASE ( 0, 1, 3, 4 )    !   3, 4 : T-Pivot at North Fold
!!$        
!!$            DO ji = 2, jpiglo_crsm1
!!$               ijie = ( ji * nn_factx ) - nn_factx   !cc
!!$               ijis = ijie - nn_factx + 1
!!$               mis2_crs(ji) = ijis
!!$               mie2_crs(ji) = ijie
!!$            ENDDO
!!$            IF ( jpiglo - 1 - mie2_crs(jpiglo_crsm1) <= nn_factx ) mie2_crs(jpiglo_crsm1) = jpiglo - 2  
!!$
!!$            ! Handle first the northernmost bin
!!$            IF ( nn_facty == 2 ) THEN   ;    ijjgloT = jpjglo - 1 
!!$            ELSE                        ;    ijjgloT = jpjglo
!!$            ENDIF
!!$
!!$            DO jj = 2, jpjglo_crs
!!$                ijje = ijjgloT - nn_facty * ( jj - 3 )
!!$                ijjs = ijje - nn_facty + 1                   
!!$                mjs2_crs(jpjglo_crs-jj+2) = ijjs
!!$                mje2_crs(jpjglo_crs-jj+2) = ijje
!!$            ENDDO
!!$
!!$         CASE ( 2 ) 
!!$            WRITE(numout,*)  'crs_init, jperio=2 not supported' 
!!$        
!!$         CASE ( 5, 6 )    ! F-pivot at North Fold
!!$
!!$            DO ji = 2, jpiglo_crsm1
!!$               ijie = ( ji * nn_factx ) - nn_factx 
!!$               ijis = ijie - nn_factx + 1
!!$               mis2_crs(ji) = ijis
!!$               mie2_crs(ji) = ijie
!!$            ENDDO
!!$            IF ( jpiglo - 1 - mie2_crs(jpiglo_crsm1) <= nn_factx ) mie_crs(jpiglo_crsm1)  = jpiglo - 2 
!!$
!!$            ! Treat the northernmost bin separately.
!!$            jj = 2
!!$            ijje = jpj - nn_facty * ( jj - 2 )
!!$            IF ( nn_facty == 3 ) THEN   ;  ijjs = ijje - 1 
!!$            ELSE                        ;  ijjs = ijje - nn_facty + 1
!!$            ENDIF
!!$            mjs2_crs(jpj_crs-jj+1) = ijjs
!!$            mje2_crs(jpj_crs-jj+1) = ijje
!!$
!!$            ! Now bin the rest, any remainder at the south is lumped in the southern bin
!!$            DO jj = 3, jpjglo_crsm1
!!$                ijje = jpjglo - nn_facty * ( jj - 2 )
!!$                ijjs = ijje - nn_facty + 1                  
!!$                IF ( ijjs <= nn_facty )  ijjs = 2
!!$                mjs2_crs(jpj_crs-jj+1)   = ijjs
!!$                mje2_crs(jpj_crs-jj+1)   = ijje
!!$            ENDDO
!!$
!!$         CASE DEFAULT
!!$            WRITE(numout,*) 'crs_init. Only jperio = 0, 1, 3, 4, 5, 6 supported' 
!!$ 
!!$         END SELECT

      CASE (1 )
         WRITE(numout,*) 'crs_init.  Equator-centered bins option not yet available' 

      END SELECT

     ! Pad the boundaries, do not know if it is necessary
      mis2_crs(2) = 1             ;  mis2_crs(jpiglo_crs) = mie2_crs(jpiglo_crs - 1) + 1   
      mie2_crs(2) = nn_factx      ;  mie2_crs(jpiglo_crs) = jpiglo                         
      !
      mjs2_crs(1) = 1
      mje2_crs(1) = 1
      !
      mje2_crs(2) = mjs2_crs(3)-1 ;  mje2_crs(jpjglo_crs) = jpjglo
      mjs2_crs(2) = 1             ;  mjs2_crs(jpjglo_crs) = mje2_crs(jpjglo_crs) - nn_facty + 1 
 
      IF( .NOT. lk_mpp ) THEN     
        mis_crs(:) = mis2_crs(:) 
        mie_crs(:) = mie2_crs(:)
        mjs_crs(:) = mjs2_crs(:) 
        mje_crs(:) = mje2_crs(:) 
      ELSE
        DO jj = 1, Nje0_crs
           mjs_crs(jj) = mjs2_crs(mjg_crs(jj)) - njmpp + 1
           mje_crs(jj) = mje2_crs(mjg_crs(jj)) - njmpp + 1
        ENDDO
        DO ji = 1, Nie0_crs
           mis_crs(ji) = mis2_crs(mig_crs(ji)) - nimpp + 1
           mie_crs(ji) = mie2_crs(mig_crs(ji)) - nimpp + 1
        ENDDO
      ENDIF
      !
      nistr = mis_crs(2)  ;   niend = mis_crs(jpi_crs - 1)
      njstr = mjs_crs(3)  ;   njend = mjs_crs(jpj_crs - 1)
      !
   END SUBROUTINE crs_dom_def
   
   SUBROUTINE crs_dom_bat
      !!----------------------------------------------------------------
      !!               *** SUBROUTINE crs_dom_bat ***
      !! ** Purpose :  coarsenig bathy
      !!----------------------------------------------------------------
      !! 
      !!  local variables
      INTEGER  :: ji,jj,jk      ! dummy indices
      REAL(wp), DIMENSION(jpi_crs, jpj_crs) :: zmbk
      !!----------------------------------------------------------------
   
      mbathy_crs(:,:) = jpkm1
      mbkt_crs(:,:) = 1
      mbku_crs(:,:) = 1
      mbkv_crs(:,:) = 1


      DO jj = 1, jpj_crs
         DO ji = 1, jpi_crs
            jk = 0
            DO WHILE( tmask_crs(ji,jj,jk+1) > 0.)
               jk = jk + 1
            ENDDO
            mbathy_crs(ji,jj) = float( jk )
         ENDDO
      ENDDO
     
      zmbk(:,:) = 0.0
      zmbk(:,:) = REAL( mbathy_crs(:,:), wp ) ;   CALL crs_lbc_lnk(zmbk,'T',1.0_wp)   ;   mbathy_crs(:,:) = NINT( zmbk(:,:) )


      !
      IF(lwp) WRITE(numout,*)
      IF(lwp) WRITE(numout,*) '    crsini : mbkt is ocean bottom k-index of T-, U-, V- and W-levels '
      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~~~'
      !
      mbkt_crs(:,:) = MAX( mbathy_crs(:,:) , 1 )    ! bottom k-index of T-level (=1 over land)
      !                                     ! bottom k-index of W-level = mbkt+1

      DO jj = 1, jpj_crsm1                      ! bottom k-index of u- (v-) level
         DO ji = 1, jpi_crsm1
            mbku_crs(ji,jj) = MIN(  mbkt_crs(ji+1,jj  ) , mbkt_crs(ji,jj)  )
            mbkv_crs(ji,jj) = MIN(  mbkt_crs(ji  ,jj+1) , mbkt_crs(ji,jj)  )
         END DO
      END DO

      ! convert into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk
      zmbk(:,:) = 1.e0;    
      zmbk(:,:) = REAL( mbku_crs(:,:), wp )   ;   CALL crs_lbc_lnk(zmbk,'U',1.0_wp) ; mbku_crs  (:,:) = MAX( NINT( zmbk(:,:) ), 1 ) 
      zmbk(:,:) = REAL( mbkv_crs(:,:), wp )   ;   CALL crs_lbc_lnk(zmbk,'V',1.0_wp) ; mbkv_crs  (:,:) = MAX( NINT( zmbk(:,:) ), 1 ) 
      !
   END SUBROUTINE crs_dom_bat


END MODULE crsdom