New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 419 – NEMO

Changeset 419


Ignore:
Timestamp:
2006-03-21T09:38:39+01:00 (18 years ago)
Author:
opalod
Message:

nemo_v1_update_040 : CT : New functionality for the sea-ice initialization, initialize sst and sss form sst and sss reading in the ice initialization file in the lim_istate_init subroutine

Location:
trunk/NEMO/LIM_SRC
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/LIM_SRC/ice.F90

    r247 r419  
    5454      ust2s                 !: friction velocity 
    5555 
     56   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::  &  !: 
     57        sst_ini,         &  !: sst read from a file for ice model initialization  
     58        sss_ini             !: sss read from a file for ice model initialization  
    5659 
    5760   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   &  !: 
  • trunk/NEMO/LIM_SRC/limistate.F90

    r299 r419  
    6161      !! History : 
    6262      !!   2.0  !  01-04  (C. Ethe, G. Madec)  Original code 
     63      !!        !  04-04  (S. Theetten) initialization from a file 
    6364      !!-------------------------------------------------------------------- 
    6465      !! * Local variables 
     
    7778      v_io(:,:)  = 0.e0       ! ice velocity in y direction 
    7879 
    79       ! Initialisation at tn or -2 if ice 
    80       DO jj = 1, jpj 
    81          DO ji = 1, jpi 
    82             zbin = MAX( 0., SIGN( 1., fzptn(ji,jj) - tn(ji,jj,1) ) ) 
    83             ztn(ji,jj) = ( (1.-zbin) * tn(ji,jj,1) - 2. * zbin + rt0 ) * tmask(ji,jj,1) 
     80      IF( ln_limini ) THEN    !  
     81         
     82         ! Initialisation at tn if no ice or sst_ini if ice 
     83         ! Idem for salinity 
     84 
     85      !--- Criterion for presence (zidto=1.) or absence (zidto=0.) of ice 
     86         DO jj = 1 , jpj 
     87            DO ji = 1 , jpi 
     88                
     89               zidto = MAX(zzero, - SIGN(1.,frld(ji,jj) - 1.)) 
     90                
     91               sst_io(ji,jj) = ( nfice - 1 ) * (zidto * sst_ini(ji,jj)  + &   ! use the ocean initial values 
     92                    &          (1.0 - zidto ) * ( tn(ji,jj,1) + rt0 ))        ! tricky trick *(nfice-1) ! 
     93               sss_io(ji,jj) = ( nfice - 1 ) * (zidto * sss_ini(ji,jj) + & 
     94                    &          (1.0 - zidto ) *  sn(ji,jj,1) ) 
     95 
     96               ! to avoid the the melting of ice, several layers (mixed layer) should be 
     97               ! set to sst_ini (sss_ini) if there is ice 
     98               ! example for one layer  
     99               ! tn(ji,jj,1) = zidto * ( sst_ini(ji,jj) - rt0 )  + (1.0 - zidto ) *  tn(ji,jj,1) 
     100               ! sn(ji,jj,1) = zidto * sss_ini(ji,jj)  + (1.0 - zidto ) *  sn(ji,jj,1) 
     101               ! tb(ji,jj,1) = tn(ji,jj,1) 
     102               ! sb(ji,jj,1) = sn(ji,jj,1) 
     103            END DO 
    84104         END DO 
    85       END DO 
    86  
    87  
    88       u_io  (:,:) = 0.e0 
    89       v_io  (:,:) = 0.e0 
    90       sst_io(:,:) = ( nfice - 1 ) * ( tn(:,:,1) + rt0 )   ! use the ocean initial values 
    91       sss_io(:,:) = ( nfice - 1 ) *   sn(:,:,1)           ! tricky trick *(nfice-1) ! 
    92  
    93       ! reference salinity 34psu 
    94       zs0 = 34.e0 
    95       ztf = ABS ( rt0 - 0.0575       * zs0                               & 
    96                &                    + 1.710523e-03 * zs0 * SQRT( zs0 )   & 
    97                &                    - 2.154996e-04 * zs0 *zs0          ) 
    98  
    99       !  tfu: Melting point of sea water 
    100       tfu(:,:)  = ztf    
    101     
    102       DO jj = 1, jpj 
    103          DO ji = 1, jpi 
    104             !--- Criterion for presence (zidto=1) or absence (zidto=0) of ice 
    105             zidto  = tms(ji,jj) * ( 1.0 - MAX(zzero, SIGN( zone, ztn(ji,jj) - tfu(ji,jj) - ttest) ) ) 
    106  
    107             IF( fcor(ji,jj) >= 0.e0 ) THEN     !--  Northern hemisphere. 
    108                hicif(ji,jj)   = zidto * hginn 
    109                frld(ji,jj)    = zidto * alinn + ( 1.0 - zidto ) * 1.0 
    110                hsnif(ji,jj)   = zidto * hninn 
    111             ELSE                               !---  Southern hemisphere. 
    112                hicif(ji,jj)   = zidto * hgins 
    113                frld(ji,jj)    = zidto * alins + ( 1.0 - zidto ) * 1.0 
    114                hsnif(ji,jj)   = zidto * hnins 
    115             ENDIF 
     105          
     106          
     107         !  tfu: Melting point of sea water 
     108         tfu(:,:)  = ztf    
     109          
     110         tfu(:,:)  = ABS ( rt0 - 0.0575       * sss_ini(:,:)                               & 
     111              &                    + 1.710523e-03 * sss_ini(:,:) * SQRT( sss_ini(:,:) )    & 
     112              &                    - 2.154996e-04 * sss_ini(:,:) * sss_ini(:,:) ) 
     113      ELSE                     ! 
     114 
     115          
     116         ! Initialisation at tn or -2 if ice 
     117         DO jj = 1, jpj 
     118            DO ji = 1, jpi 
     119               zbin = MAX( 0., SIGN( 1., fzptn(ji,jj) - tn(ji,jj,1) ) ) 
     120               ztn(ji,jj) = ( (1.-zbin) * tn(ji,jj,1) - 2. * zbin + rt0 ) * tmask(ji,jj,1) 
     121            END DO 
    116122         END DO 
    117       END DO 
    118  
    119       sist  (:,:)   = tfu(:,:) 
    120       tbif  (:,:,1) = tfu(:,:) 
    121       tbif  (:,:,2) = tfu(:,:) 
    122       tbif  (:,:,3) = tfu(:,:) 
     123          
     124         u_io  (:,:) = 0.e0 
     125         v_io  (:,:) = 0.e0 
     126         sst_io(:,:) = ( nfice - 1 ) * ( tn(:,:,1) + rt0 )   ! use the ocean initial values 
     127         sss_io(:,:) = ( nfice - 1 ) *   sn(:,:,1)           ! tricky trick *(nfice-1) ! 
     128          
     129         ! reference salinity 34psu 
     130         zs0 = 34.e0 
     131         ztf = ABS ( rt0 - 0.0575       * zs0                           & 
     132              &                    + 1.710523e-03 * zs0 * SQRT( zs0 )   & 
     133              &                    - 2.154996e-04 * zs0 *zs0          ) 
     134          
     135         !  tfu: Melting point of sea water 
     136         tfu(:,:)  = ztf    
     137          
     138         DO jj = 1, jpj 
     139            DO ji = 1, jpi 
     140               !--- Criterion for presence (zidto=1) or absence (zidto=0) of ice 
     141               zidto  = tms(ji,jj) * ( 1.0 - MAX(zzero, SIGN( zone, ztn(ji,jj) - tfu(ji,jj) - ttest) ) ) 
     142                
     143               IF( fcor(ji,jj) >= 0.e0 ) THEN     !--  Northern hemisphere. 
     144                  hicif(ji,jj)   = zidto * hginn 
     145                  frld(ji,jj)    = zidto * alinn + ( 1.0 - zidto ) * 1.0 
     146                  hsnif(ji,jj)   = zidto * hninn 
     147               ELSE                               !---  Southern hemisphere. 
     148                  hicif(ji,jj)   = zidto * hgins 
     149                  frld(ji,jj)    = zidto * alins + ( 1.0 - zidto ) * 1.0 
     150                  hsnif(ji,jj)   = zidto * hnins 
     151               ENDIF 
     152            END DO 
     153         END DO 
     154          
     155         sist  (:,:)   = tfu(:,:) 
     156         tbif  (:,:,1) = tfu(:,:) 
     157         tbif  (:,:,2) = tfu(:,:) 
     158         tbif  (:,:,3) = tfu(:,:) 
     159       
     160      ENDIF 
    123161      fsbbq (:,:)   = 0.e0 
    124162      qstoif(:,:)   = 0.e0 
     
    176214      !! 
    177215      !! ** Method  :   Read the namiceini namelist and check the parameter  
    178       !!       values called at the first timestep (nit000) 
     216      !!                values called at the first timestep (nit000) 
     217      !!                or 
     218      !!                Read 7 variables from a previous restart file 
     219      !!                sst, sst, hicif, hsnif, frld, ts & tbif 
    179220      !! 
    180221      !! ** input   :   Namelist namiceini 
     
    182223      !! history 
    183224      !!  8.5  ! 03-08 (C. Ethe) original code 
    184       !!------------------------------------------------------------------- 
    185       NAMELIST/namiceini/ ttest, hninn, hginn, alinn, hnins, hgins, alins 
    186       !!------------------------------------------------------------------- 
    187  
     225      !!  9.0  ! 04-04 (S. Theetten) read a file 
     226      !!------------------------------------------------------------------- 
     227      !! * Modules used 
     228      USE ice 
     229      USE ioipsl 
     230 
     231      NAMELIST/namiceini/ ln_limini, ln_limdmp, ttest, hninn, hginn, alinn, & 
     232         &                hnins, hgins, alins 
     233      !!------------------------------------------------------------------- 
     234      !! local declaration 
     235      INTEGER, PARAMETER ::   jpmois=1 
     236       
     237      INTEGER ::                   & 
     238           itime, ipi, ipj, ipk  , & ! temporary integers 
     239           inum_ice 
     240       
     241      INTEGER ::  istep(jpmois) 
     242       
     243      REAL(wp) ::   zdate0, zdt 
     244      REAL(wp), DIMENSION(jpi,jpj) ::   zlon, zlat 
     245      REAL(wp), DIMENSION(3) ::   zlev 
     246       
     247      CHARACTER (len=32) :: cl_icedata 
     248       
     249      LOGICAL :: llbon 
     250      !!------------------------------------------------------------------- 
     251       
    188252      ! Read Namelist namiceini  
    189253 
    190254      REWIND ( numnam_ice ) 
    191255      READ   ( numnam_ice , namiceini ) 
    192       IF(lwp) THEN 
    193          WRITE(numout,*) 
    194          WRITE(numout,*) 'lim_istate_init : ice parameters inititialisation ' 
    195          WRITE(numout,*) '~~~~~~~~~~~~~~~' 
    196          WRITE(numout,*) '         threshold water temp. for initial sea-ice    ttest      = ', ttest 
    197          WRITE(numout,*) '         initial snow thickness in the north          hninn      = ', hninn 
    198          WRITE(numout,*) '         initial ice thickness in the north           hginn      = ', hginn  
    199          WRITE(numout,*) '         initial leads area in the north              alinn      = ', alinn             
    200          WRITE(numout,*) '         initial snow thickness in the south          hnins      = ', hnins  
    201          WRITE(numout,*) '         initial ice thickness in the south           hgins      = ', hgins 
    202          WRITE(numout,*) '         initial leads area in the south              alins      = ', alins 
     256       
     257      IF(.NOT. ln_limini) THEN  
     258         IF(lwp) THEN 
     259            WRITE(numout,*) 
     260            WRITE(numout,*) 'lim_istate_init : ice parameters inititialisation ' 
     261            WRITE(numout,*) '~~~~~~~~~~~~~~~' 
     262            WRITE(numout,*) '         threshold water temp. for initial sea-ice    ttest      = ', ttest 
     263            WRITE(numout,*) '         initial snow thickness in the north          hninn      = ', hninn 
     264            WRITE(numout,*) '         initial ice thickness in the north           hginn      = ', hginn  
     265            WRITE(numout,*) '         initial leads area in the north              alinn      = ', alinn             
     266            WRITE(numout,*) '         initial snow thickness in the south          hnins      = ', hnins  
     267            WRITE(numout,*) '         initial ice thickness in the south           hgins      = ', hgins 
     268            WRITE(numout,*) '         initial leads area in the south              alins      = ', alins 
     269         ENDIF 
    203270      ENDIF 
    204              
     271 
     272      IF( ln_limini ) THEN                      ! Ice initialization using input file 
     273 
     274         cl_icedata = 'Ice_initialization.nc' 
     275         INQUIRE( FILE=cl_icedata, EXIST=llbon ) 
     276         IF( llbon ) THEN 
     277            IF(lwp) THEN 
     278               WRITE(numout,*) ' ' 
     279               WRITE(numout,*) 'lim_istate_init : ice state initialization with : ',cl_icedata 
     280               WRITE(numout,*) '~~~~~~~~~~~~~~~' 
     281               WRITE(numout,*) '         Ice state initialization using input file    ln_limini  = ', ln_limini 
     282               WRITE(numout,*) '         Ice damping                                  ln_limdmp  = ', ln_limdmp 
     283               WRITE(numout,*) ' ' 
     284            ENDIF 
     285             
     286            itime = 1 
     287            ipi=jpiglo 
     288            ipj=jpjglo 
     289            ipk=1 
     290            zdt=rdt 
     291             
     292            CALL flinopen( TRIM(cl_icedata), mig(1), nlci, mjg(1), nlcj, .FALSE., & 
     293               &           ipi, ipj, ipk, zlon, zlat, zlev, itime, istep, zdate0, zdt, inum_ice ) 
     294             
     295            CALL flinget( inum_ice, 'sst', jpidta, jpjdta, 1,  & 
     296               &          jpmois, 1, 0, mig(1), nlci, mjg(1), nlcj, sst_ini(1:nlci,1:nlcj) ) 
     297             
     298            CALL flinget( inum_ice, 'sss', jpidta, jpjdta, 1,  & 
     299               &          jpmois, 1, 0, mig(1), nlci, mjg(1), nlcj, sss_ini(1:nlci,1:nlcj) ) 
     300             
     301            CALL flinget( inum_ice, 'hicif', jpidta, jpjdta, 1,  & 
     302               &          jpmois, 1, 0, mig(1), nlci, mjg(1), nlcj, hicif(1:nlci,1:nlcj) ) 
     303             
     304            CALL flinget( inum_ice, 'hsnif', jpidta, jpjdta, 1,  & 
     305               &          jpmois, 1, 0, mig(1), nlci, mjg(1), nlcj, hsnif(1:nlci,1:nlcj) ) 
     306             
     307            CALL flinget( inum_ice, 'frld', jpidta, jpjdta, 1,  & 
     308               &          jpmois, 1, 0, mig(1), nlci, mjg(1), nlcj, frld(1:nlci,1:nlcj) ) 
     309             
     310            CALL flinget( inum_ice, 'ts', jpidta, jpjdta, 1,  & 
     311               &          jpmois, 1, 0, mig(1), nlci, mjg(1), nlcj, sist(1:nlci,1:nlcj) ) 
     312             
     313            CALL flinclo( inum_ice) 
     314             
     315            itime = 1 
     316            ipi=jpiglo 
     317            ipj=jpjglo 
     318            ipk=jplayersp1 
     319             
     320            CALL flinopen( TRIM(cl_icedata), mig(1), nlci, mjg(1), nlcj, .FALSE.,  & 
     321               &           ipi, ipj, ipk, zlon, zlat, zlev, itime, istep, zdate0, zdt, inum_ice ) 
     322             
     323            CALL flinget( inum_ice, 'tbif', jpidta, jpjdta, ipk,  & 
     324               &          jpmois, 1, 0, mig(1), nlci, mjg(1), nlcj, tbif(1:nlci,1:nlcj,1:ipk) ) 
     325             
     326            CALL flinclo( inum_ice) 
     327             
     328         ELSE 
     329            IF(lwp) WRITE(numout,cform_err)  
     330            IF(lwp) WRITE(numout,*) '            ',cl_icedata, ' not found !' 
     331            nstop = nstop + 1 
     332         ENDIF 
     333      ENDIF 
     334 
    205335   END SUBROUTINE lim_istate_init 
    206336 
Note: See TracChangeset for help on using the changeset viewer.