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 93 – NEMO

Changeset 93


Ignore:
Timestamp:
2004-06-25T08:33:00+02:00 (20 years ago)
Author:
opalod
Message:

CT : UPDATE060 : A new configuration, named GYRE, has been added.

Location:
trunk/NEMO/OPA_SRC
Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/DOM/domain.F90

    r72 r93  
    143143      NAMELIST/namrun/ no    , cexper   , ln_rstart , nrstdt , nit000,   & 
    144144         &             nitend, ndate0   , nleapy   , ninist , nstock,   & 
    145          &             nprint, nwrite   , nrunoff  , ln_ctl 
     145         &             nprint, nwrite   , nrunoff  , ln_ctl , nbench 
    146146      NAMELIST/namdom/ ntopo , e3zps_min, e3zps_rat, ngrid  , nmsh  ,   & 
    147147         &             nacc  , atfp     , rdt      , rdtmin , rdtmax,   & 
     
    176176         WRITE(numout,*) '           runoff option                   nrunoff   = ', nrunoff 
    177177         WRITE(numout,*) '           run control (for debugging)     ln_ctl    = ', ln_ctl 
     178         WRITE(numout,*) '           benchmark parameter (0/1)       nbench    = ', nbench 
    178179      ENDIF 
    179180 
     
    324325 
    325326      IF( lk_mpp ) THEN 
    326          CALL mpp_isl( iimi1 ) 
    327          CALL mpp_isl( ijmi1 ) 
    328          CALL mpp_isl( iimi2 ) 
    329          CALL mpp_isl( ijmi2 ) 
    330          CALL mpp_isl( iima1 ) 
    331          CALL mpp_isl( ijma1 ) 
    332          CALL mpp_isl( iima2 ) 
    333          CALL mpp_isl( ijma2 ) 
    334       ENDIF 
    335  
    336       IF(lwp) THEN 
     327!CT bug         CALL mpp_isl( iimi1 ) 
     328!CT bug         CALL mpp_isl( ijmi1 ) 
     329!CT bug         CALL mpp_isl( iimi2 ) 
     330!CT bug         CALL mpp_isl( ijmi2 ) 
     331!CT bug         CALL mpp_isl( iima1 ) 
     332!CT bug         CALL mpp_isl( ijma1 ) 
     333!CT bug         CALL mpp_isl( iima2 ) 
     334!CT bug         CALL mpp_isl( ijma2 ) 
     335      ENDIF 
     336 
     337      IF(lwp) THEN 
     338         IF(lk_mpp) THEN 
     339            WRITE(numout,cform_war) 
     340            WRITE(numout,*)'      Min(Max) of e1t, e2t are those of the first proc only' 
     341            WRITE(numout,*) 
     342         END IF 
    337343         WRITE(numout,"(14x,'e1t maxi: ',1f10.2,' at i = ',i3,' j= ',i3)") ze1max, iima1, ijma1 
    338344         WRITE(numout,"(14x,'e1t mini: ',1f10.2,' at i = ',i3,' j= ',i3)") ze1min, iimi1, ijmi1 
  • trunk/NEMO/OPA_SRC/DOM/domhgr.F90

    r81 r93  
    11MODULE domhgr 
    22   !!============================================================================== 
    3    !!                       ***  MODULE domain   *** 
     3   !!                       ***  MODULE domhgr   *** 
    44   !! Ocean initialization : domain initialization 
    55   !!============================================================================== 
     
    1919 
    2020   !! * Module variables 
    21    REAL (wp)  :: glam0, gphi0        ! variables corresponding to parameters 
    22       !                              ! ppglam0 ppgphi0 set in par_oce 
     21   REAL(wp) ::   glam0, gphi0           ! variables corresponding to parameters 
     22      !                                 ! ppglam0 ppgphi0 set in par_oce 
    2323 
    2424   !! * Routine accessibility 
     
    9595      !!   9.0  !  04-01  (A.M. Treguier, J.M. Molines) Case 4 (Mercator mesh) 
    9696      !!                  use of parameters in par_CONFIG-Rxx.h90, not in namelist 
     97      !!        !  04-05  (A. Koch-Larrouy) Add Gyre configuration  
    9798      !!---------------------------------------------------------------------- 
    9899      !! * local declarations 
     
    105106         zphi0, zbeta, znorme,       &  ! 
    106107         zarg, zf0 
     108      REAL(wp) ::   & 
     109         zlam1, zcos_alpha, zim1 , zjm1 , ze1, ze1deg,   & 
     110         zphi1, zsin_alpha, zim05, zjm05 
    107111      !!---------------------------------------------------------------------- 
    108112 
     
    280284         ! Latitude 
    281285               gphit(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* ztj ) ) 
    282                gphiu(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* ztj ) ) 
    283                gphiv(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* ztj ) ) 
    284                gphif(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* ztj ) ) 
     286               gphiu(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* zuj ) ) 
     287               gphiv(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* zvj ) ) 
     288               gphif(ji,jj) = 1./rad * ASIN ( TANH( ppe1_deg *rad* zfj ) ) 
    285289         ! e1 
    286290               e1t(ji,jj) = ra * rad * COS( rad * gphit(ji,jj) ) * ppe1_deg 
     
    295299            END DO 
    296300         END DO 
     301 
     302      CASE ( 5 )                   ! beta-plane with regular grid-spacing and rotated domain (GYRE configuration) 
     303 
     304         IF(lwp) WRITE(numout,*) 
     305         IF(lwp) WRITE(numout,*) '          beta-plane with regular grid-spacing and rotated domain (GYRE configuration)' 
     306         IF(lwp) WRITE(numout,*) '          given by ppe1_m and ppe2_m' 
     307 
     308         ! Position coordinates (in kilometers) 
     309         !                          ========== 
     310 
     311         ! angle 45° and ze1=106.e+3 / jp_cfg forced -> zlam1 = -85°, zphi1 = 29°N 
     312         zlam1 = -85 
     313         zphi1 = 29 
     314         ze1 = 106000. / FLOAT(jp_cfg)            ! resolution in meters 
     315         IF( nbench /= 0 )   ze1 = 106000.e0     ! benchmark: forced the resolution to be about 100 km 
     316         zsin_alpha = - SQRT( 2. ) / 2. 
     317         zcos_alpha =   SQRT( 2. ) / 2. 
     318         ze1deg = ze1 / (ra * rad) 
     319         IF( nbench /= 0 )   ze1deg = ze1deg / FLOAT(jp_cfg)        ! benchmark: keep the lat/+lon 
     320         !                                                           ! at the right jp_cfg resolution 
     321         glam0 = zlam1 + zcos_alpha * ze1deg * FLOAT( jpjglo-2 ) 
     322         gphi0 = zphi1 + zsin_alpha * ze1deg * FLOAT( jpjglo-2 ) 
     323 
     324         IF(lwp) WRITE(numout,*) 'ze1', ze1, 'cosalpha', zcos_alpha, 'sinalpha', zsin_alpha 
     325         IF(lwp) WRITE(numout,*) 'ze1deg', ze1deg, 'glam0', glam0, 'gphi0', gphi0 
     326 
     327         DO jj = 1, jpj 
     328           DO ji = 1, jpi 
     329             zim1 = FLOAT( ji + nimpp - 1 ) - 1.   ;   zim05 = FLOAT( ji + nimpp - 1 ) - 1.5 
     330             zjm1 = FLOAT( jj + njmpp - 1 ) - 1.   ;   zjm05 = FLOAT( jj + njmpp - 1 ) - 1.5 
     331 
     332             glamf(ji,jj) = glam0 + zim1  * ze1deg * zcos_alpha + zjm1  * ze1deg * zsin_alpha 
     333             gphif(ji,jj) = gphi0 - zim1  * ze1deg * zsin_alpha + zjm1  * ze1deg * zcos_alpha 
     334 
     335             glamt(ji,jj) = glam0 + zim05 * ze1deg * zcos_alpha + zjm05 * ze1deg * zsin_alpha 
     336             gphit(ji,jj) = gphi0 - zim05 * ze1deg * zsin_alpha + zjm05 * ze1deg * zcos_alpha 
     337 
     338             glamu(ji,jj) = glam0 + zim1  * ze1deg * zcos_alpha + zjm05 * ze1deg * zsin_alpha 
     339             gphiu(ji,jj) = gphi0 - zim1  * ze1deg * zsin_alpha + zjm05 * ze1deg * zcos_alpha 
     340 
     341             glamv(ji,jj) = glam0 + zim05 * ze1deg * zcos_alpha + zjm1  * ze1deg * zsin_alpha 
     342             gphiv(ji,jj) = gphi0 - zim05 * ze1deg * zsin_alpha + zjm1  * ze1deg * zcos_alpha 
     343           END DO 
     344          END DO 
     345 
     346         ! Horizontal scale factors (in meters) 
     347         !                              ====== 
     348         e1t(:,:) =  ze1     ;      e2t(:,:) = ze1 
     349         e1u(:,:) =  ze1     ;      e2u(:,:) = ze1 
     350         e1v(:,:) =  ze1     ;      e2v(:,:) = ze1 
     351         e1f(:,:) =  ze1     ;      e2f(:,:) = ze1 
    297352 
    298353      CASE DEFAULT 
     
    368423         IF(lwp) WRITE(numout,*) '                      Coriolis parameter varies from ', ff(1,1),' to ', ff(1,jpj) 
    369424 
     425      CASE ( 5 )                     ! beta-plane and rotated domain 
     426 
     427         zbeta = 2. * omega * COS( rad * ppgphi0 ) / ra                     ! beta at latitude ppgphi0 
     428         zphi0 = 15.e0                                                      ! latitude of the first row F-points 
     429         zf0   = 2. * omega * SIN( rad * zphi0 )                            ! compute f0 1st point south 
     430 
     431         ff(:,:) = ( zf0 + zbeta * ABS( gphif(:,:) - zphi0 ) * rad * ra )   ! f = f0 +beta* y ( y=0 at south) 
     432 
     433         IF(lwp) WRITE(numout,*) '          Beta-plane: Beta parameter = constant = ', ff(1,1) 
     434         IF(lwp) WRITE(numout,*) '                      Coriolis parameter varies from ', ff(1,1),' to ', ff(1,jpj) 
     435 
    370436      END SELECT 
    371437 
  • trunk/NEMO/OPA_SRC/SBC/ocesbc.F90

    r84 r93  
    563563      !!               
    564564      !! ** Purpose :   provide the thermohaline fluxes (heat and freshwater) 
    565       !!      to the ocean at each time step. 
     565      !!                to the ocean at each time step. 
    566566      !! 
    567567      !! ** Method  :   Constant surface fluxes (read in namelist (namflx)) 
     
    572572      !!        !  91-03  ()  Original code 
    573573      !!   8.5  !  02-09  (G. Madec)  F90: Free form and module 
     574      !!   9.0  !  04-05  (A. Koch-Larrouy) Add Gyre configuration  
    574575      !!---------------------------------------------------------------------- 
    575576      !! * Modules used 
    576577      USE flxrnf                       ! ocean runoffs 
     578      USE daymod, ONLY : nyear         ! calendar 
    577579 
    578580      !! * arguments 
     
    584586         qsr0 = 0.e0,               &  ! solar heat flux 
    585587         emp0 = 0.e0                   ! net freshwater flux 
     588      REAL(wp) ::   ztrp, zemp_S, zemp_N, zemp_sais, zTstar, zcos_sais, zconv 
     589      REAL(wp) ::           & 
     590         zsumemp,           &          ! tampon used for the emp sum 
     591         zsurf,             &          ! tampon used for the domain sum 
     592         ztime,             &          ! time in hour 
     593         ztimemax, ztimemin            ! 21th june, and 21th december if date0 = 1st january 
     594      REAL(wp), DIMENSION(jpi,jpj) :: t_star 
     595      INTEGER  ::   ji, jj,  &         ! dummy loop indices 
     596         js                            ! indice for months 
     597      INTEGER  ::           & 
     598         zyear0,            &          ! initial year 
     599         zmonth0,           &          ! initial month 
     600         zday0,             &          ! initial day 
     601         zday_year0,        &          ! initial day since january 1st 
     602         zdaymax 
    586603 
    587604      NAMELIST/namflx/ q0, qsr0, emp0 
    588605      !!--------------------------------------------------------------------- 
    589606 
    590       IF( kt == nit000 ) THEN 
    591  
    592          ! Read Namelist namflx : surface thermohaline fluxes 
    593          ! -------------------- 
    594          REWIND ( numnam ) 
    595          READ   ( numnam, namflx ) 
    596  
    597          IF(lwp) WRITE(numout,*)' ' 
    598          IF(lwp) WRITE(numout,*)' ocesbc  : Constant surface fluxes read in namelist' 
    599          IF(lwp) WRITE(numout,*)' ~~~~~~~ ' 
    600          IF(lwp) WRITE(numout,*)'           Namelist namflx: set the constant flux values' 
    601          IF(lwp) WRITE(numout,*)'              net heat flux          q0   = ', q0  , ' W/m2' 
    602          IF(lwp) WRITE(numout,*)'              solar heat flux        qsr0 = ', qsr0, ' W/m2' 
    603          IF(lwp) WRITE(numout,*)'              net heat flux          emp0 = ', emp0, ' W/m2' 
    604  
    605          qt    (:,:) = q0 
    606          qsr   (:,:) = qsr0 
    607          q     (:,:) = q0 
    608          emp   (:,:) = emp0 
    609          emps  (:,:) = emp0 
    610          qrp   (:,:) = 0.e0 
    611          erp   (:,:) = 0.e0 
    612  
    613          runoff(:,:) = 0.e0 
     607      !same temperature, E-P as in HAZELEGER 2000 
     608 
     609      IF( cp_cfg == 'gyre' ) THEN 
     610 
     611          zyear0  = ndate0 / 10000 
     612          zmonth0 = ( ndate0 - zyear0 * 10000 ) / 100 
     613          zday0   = ndate0 - zyear0 * 10000 - zmonth0 * 100 
     614          !Calculates nday_year, day since january 1st 
     615          zday_year0 = zday0 
     616          !accumulates days of previous months of this year 
     617 
     618          DO js = 1, zmonth0 
     619            IF(nleapy > 1) THEN 
     620                zday_year0 = zday_year0 + nleapy 
     621            ELSE 
     622                IF( MOD(zyear0, 4 ) == 0 ) THEN 
     623                    zday_year0 = zday_year0 + nbiss(js) 
     624                ELSE 
     625                    zday_year0 = zday_year0 + nobis(js) 
     626                ENDIF 
     627            ENDIF 
     628          END DO 
     629          ! day (in hours) since january the 1st 
     630          ztime = FLOAT( kt ) * rdt / (rmmss * rhhmm)  &  ! incrementation in hour 
     631             &     - (nyear - 1) * rjjhh * raajj       &  !  - nber of hours the precedent years 
     632             &     + zday_year0 / 24                      ! nber of hours initial date 
     633          ! day 21th counted since the 1st January 
     634          zdaymax = 21                                    ! 21th day of the month 
     635          DO js = 1, 5                                    ! count each day  until end May 
     636            IF(nleapy > 1) THEN 
     637                zdaymax = zdaymax + nleapy 
     638            ELSE 
     639                IF( MOD(zyear0, 4 ) == 0 ) THEN 
     640                    zdaymax = zdaymax + nbiss(js) 
     641                ELSE 
     642                    zdaymax = zdaymax + nobis(js) 
     643                ENDIF 
     644            ENDIF 
     645          END DO 
     646          ! 21th june in hours 
     647          ztimemax = zdaymax * 24 
     648          ! 21th december day in hours 
     649          ztimemin = ztimemax + rjjhh * raajj / 2         ! rjjhh * raajj / 4 = 1 seasonal cycle in hours 
     650          ! amplitudes 
     651          zemp_S   = 0.7       ! intensity of COS in the South 
     652          zemp_N   = 0.8       ! intensity of COS in the North 
     653          zemp_sais= 0.1 
     654          zTstar   = 28.3      ! intemsity from 28.3 à -5° 
     655          zcos_sais = COS( (ztime - ztimemax) / (ztimemin - ztimemax) * rpi )         ! 1/2 period between 21th June and 21th December 
     656          ztrp= - 40.          ! retroaction term (W/m2/K) 
     657          zconv = 3.16e-5      ! convert 1m/yr->3.16e-5mm/s 
     658          DO jj = 1, jpj 
     659            DO ji = 1, jpi 
     660              t_star (ji,jj) = zTstar * ( 1 + 1. / 50. * zcos_sais )   &                  ! domain from 15° to 50° 
     661                 &             * COS( rpi * (gphit(ji,jj) - 5.)        &                  ! between 27 and 28 °C at 15N, -3  
     662                 &                        / (53.5 * ( 1 + 11 / 53.5 * zcos_sais ) * 2.) ) ! and 13°C at 50N 53.5 + or - 11  
     663                 !                                                                        ! = 1/4 period : 
     664                 !                                                                        ! 64.5 in summer, 42.5 in winter 
     665              qt  (ji,jj) = ztrp * ( tb(ji,jj,1) - t_star(ji,jj) ) 
     666              IF( gphit(ji,jj) >= 14.845 .AND. 37.2 >= gphit(ji,jj)) THEN 
     667                 emp  (ji,jj) =   zemp_S * zconv   & 
     668                    &         * SIN( rpi / 2 * (gphit(ji,jj) - 37.2) / (24.6 - 37.2) )  & ! zero at 37.8°, max at 24.6° 
     669                    &         * ( 1 - zemp_sais / zemp_S * zcos_sais) 
     670                 emps (ji,jj) = emp  (ji,jj) 
     671              ELSE 
     672                 emp (ji,jj) =  - zemp_N * zconv   & 
     673                    &         * SIN( rpi / 2 * (gphit(ji,jj) - 37.2) / (46.8 - 37.2) )  & ! zero at 37.8°, max at 46.8° 
     674                    &         * ( 1 - zemp_sais / zemp_N * zcos_sais ) 
     675                  emps (ji,jj) = emp  (ji,jj) 
     676              ENDIF 
     677              qsr (ji,jj) =  230 * COS( 3.1415 * ( gphit(ji,jj) - 23.5 * zcos_sais ) / ( 0.9 * 180 ) )   ! 23.5° : tropics 
     678            END DO 
     679          END DO 
     680          ! compute the emp flux such as its integration on the whole domain and at each time be zero 
     681          zsumemp = 0. 
     682          zsurf = 0. 
     683          DO jj = 1, jpj 
     684            DO ji = 1, jpi 
     685              zsumemp = zsumemp + emp(ji, jj) * tmask(ji, jj,  1) 
     686              zsurf =  zsurf +  tmask(ji, jj,  1) 
     687            END DO 
     688          END DO 
     689 
     690          IF( lk_mpp )   CALL mpp_sum( zsumemp  )       ! sum over the global domain 
     691          IF( lk_mpp )   CALL mpp_sum( zsurf    )       ! sum over the global domain 
     692 
     693          IF( nbench /= 0 ) THEN 
     694             ! Benchmark GYRE configuration (to allow the bit to bit comparison between Mpp/Mono case) 
     695             zsumemp = 0.e0 
     696          ELSE 
     697             ! Default GYRE configuration 
     698             zsumemp = zsumemp / zsurf 
     699          ENDIF 
     700          DO jj = 1, jpj 
     701            DO ji = 1, jpi 
     702              emp(ji, jj)=  emp(ji, jj) - zsumemp * tmask(ji, jj,  1) 
     703            END DO 
     704          END DO 
     705 
     706      ELSE 
     707 
     708         IF( kt == nit000 ) THEN 
     709 
     710            ! Read Namelist namflx : surface thermohaline fluxes 
     711            ! -------------------- 
     712            REWIND ( numnam ) 
     713            READ   ( numnam, namflx ) 
     714    
     715            IF(lwp) WRITE(numout,*)' ' 
     716            IF(lwp) WRITE(numout,*)' ocesbc  : Constant surface fluxes read in namelist' 
     717            IF(lwp) WRITE(numout,*)' ~~~~~~~ ' 
     718            IF(lwp) WRITE(numout,*)'           Namelist namflx: set the constant flux values' 
     719            IF(lwp) WRITE(numout,*)'              net heat flux          q0   = ', q0  , ' W/m2' 
     720            IF(lwp) WRITE(numout,*)'              solar heat flux        qsr0 = ', qsr0, ' W/m2' 
     721            IF(lwp) WRITE(numout,*)'              net heat flux          emp0 = ', emp0, ' W/m2' 
     722 
     723            qt    (:,:) = q0 
     724            qsr   (:,:) = qsr0 
     725            q     (:,:) = q0 
     726            emp   (:,:) = emp0 
     727            emps  (:,:) = emp0 
     728            qrp   (:,:) = 0.e0 
     729            erp   (:,:) = 0.e0 
     730    
     731            runoff(:,:) = 0.e0 
     732         ENDIF 
    614733      ENDIF 
    615734 
  • trunk/NEMO/OPA_SRC/SBC/taumod.F90

    r18 r93  
    1313   USE in_out_manager  ! I/O manager 
    1414   USE daymod          ! calendar 
     15   USE lbclnk          !  
    1516 
    1617   IMPLICIT NONE 
     
    105106      !!---------------------------------------------------------------------- 
    106107      !! * Arguments 
    107       INTEGER, INTENT( in  ) ::   kt   ! ocean time step 
     108      INTEGER, INTENT( in  ) ::   kt    ! ocean time step 
     109      REAL(wp) ::   ztau, ztau_sais, &  ! wind intensity and of the seasonal cycle 
     110         ztime,                      &  ! time in hour 
     111         ztimemax, ztimemin,         &  ! 21th June, and 21th decem. if date0 = 1st january 
     112         ztaun                          ! intensity  
     113      INTEGER  ::   ji, jj, &           ! dummy loop indices 
     114         js                             ! indice for months 
     115      INTEGER  ::           & 
     116         zyear0,            &           ! initial year 
     117         zmonth0,           &           ! initial month 
     118         zday0,             &           ! initial day 
     119         zday_year0,        &           ! initial day since january 1st 
     120         zdaymax 
    108121 
    109122      !! * Local declarations 
    110       REAL(wp) ::   zfacto             !  
     123      REAL(wp) ::   zfacto              !  
    111124 
    112125      NAMELIST/namtau/ ntau000, tau0x, tau0y 
    113126      !!--------------------------------------------------------------------- 
    114127 
    115       IF( kt == nit000 ) THEN 
    116  
    117          ! Read Namelist namtau : surface wind stress 
    118          ! -------------------- 
    119          REWIND ( numnam ) 
    120          READ   ( numnam, namtau ) 
    121  
    122          IF(lwp) WRITE(numout,*)' ' 
    123          IF(lwp) WRITE(numout,*)' tau     : Constant surface wind stress read in namelist' 
    124          IF(lwp) WRITE(numout,*)' ~~~~~~~ ' 
    125          IF(lwp) WRITE(numout,*)'           Namelist namtau: set the constant stress values' 
    126          IF(lwp) WRITE(numout,*)'              spin up of the stress  ntau000 = ', ntau000, ' time-steps' 
    127          IF(lwp) WRITE(numout,*)'              constant i-stress      tau0x   = ', tau0x  , ' N/m2' 
    128          IF(lwp) WRITE(numout,*)'              constant j-stress      tau0y   = ', tau0y  , ' N/m2' 
    129  
    130          ntau000 = MAX( ntau000, 1 )   ! must be >= 1 
    131  
    132       ENDIF 
    133  
    134       ! Increase the surface stress to its nominal value in ntau000 time-step 
    135        
    136       IF( kt <= ntau000 ) THEN 
    137          zfacto = 0.5 * (  1. - COS( rpi * FLOAT( kt ) / FLOAT( ntau000 ) )  ) 
    138          taux (:,:) = zfacto * tau0x 
    139          tauy (:,:) = zfacto * tau0y 
    140          tauxg(:,:) = zfacto * tau0x 
    141          tauyg(:,:) = zfacto * tau0y 
     128      IF( cp_cfg == 'gyre' ) THEN 
     129 
     130         ! same wind as in Wico 
     131         !test date0 : ndate0 = 010203 
     132         zyear0  = ndate0 / 10000 
     133         zmonth0 = ( ndate0 - zyear0 * 10000 ) / 100 
     134         zday0   = ndate0 - zyear0 * 10000 - zmonth0 * 100 
     135         !Calculates nday_year, day since january 1st 
     136         zday_year0 = zday0 
     137         !accumulates days of previous months of this year 
     138 
     139         DO js = 1, zmonth0 
     140            IF(nleapy > 1) THEN 
     141               zday_year0 = zday_year0 + nleapy 
     142            ELSE 
     143               IF( MOD(zyear0, 4 ) == 0 ) THEN 
     144                  zday_year0 = zday_year0 + nbiss(js) 
     145               ELSE 
     146                  zday_year0 = zday_year0 + nobis(js) 
     147               ENDIF 
     148            ENDIF 
     149         END DO 
     150    
     151         ! day (in hours) since january the 1st 
     152         ztime = FLOAT( kt ) * rdt / (rmmss * rhhmm)  &  ! incrementation in hour 
     153            &     - (nyear - 1) * rjjhh * raajj       &  !  - nber of hours the precedent years 
     154            &     + zday_year0 / 24                      ! nber of hours initial date 
     155         ! day 21th counted since the 1st January 
     156         zdaymax = 21                                    ! 21th day of the month 
     157         DO js = 1, 5                                    ! count each day  until end May 
     158           IF(nleapy > 1) THEN 
     159               zdaymax = zdaymax + nleapy 
     160           ELSE 
     161               IF( MOD(zyear0, 4 ) == 0 ) THEN 
     162                   zdaymax = zdaymax + nbiss(js) 
     163               ELSE 
     164                   zdaymax = zdaymax + nobis(js) 
     165               ENDIF 
     166           ENDIF 
     167         END DO 
     168        ! 21th june in hours 
     169         ztimemax = zdaymax * 24 
     170         ! 21th december day in hours 
     171         ztimemin = ztimemax + rjjhh * raajj / 2  ! rjjhh * raajj / 4 = 1 seasonal cycle in hours 
     172    
     173         ztau = 0.105 / SQRT(2.)            ! mean intensity at 0.105 ; srqt(2) because projected with 45° angle 
     174         ztau_sais = 0.015                  ! seasonal oscillation intensity 
     175         ztaun = ztau - ztau_sais * COS( (ztime - ztimemax) / (ztimemin - ztimemax) * rpi ) 
     176         DO jj = 1, jpj 
     177            DO ji = 1, jpi 
     178              ! domain from 15° to 50° and 1/2 period along 14° so 5/4 of half period with seasonal cycle 
     179              taux (ji,jj) = - ztaun * SIN( rpi * (gphiu(ji,jj) - 15.) / (29.-15.) ) 
     180              tauy (ji,jj) =   ztaun * SIN( rpi * (gphiv(ji,jj) - 15.) / (29.-15.) ) 
     181            END DO 
     182         END DO 
     183    
     184         IF( kt == nit000 ) THEN 
     185            IF(lwp) WRITE(numout,*)' tau     : Constant surface wind stress read in namelist' 
     186            IF(lwp) WRITE(numout,*)' ~~~~~~~ ' 
     187            IF(lwp) WRITE(numout,*)'nyear      = ', nyear 
     188            IF(lwp) WRITE(numout,*)'nmonth     = ', nmonth 
     189            IF(lwp) WRITE(numout,*)'nday       = ', nday 
     190            IF(lwp) WRITE(numout,*)'nday_year  = ',nday_year 
     191            IF(lwp) WRITE(numout,*)'ndastp     = ',ndastp 
     192            IF(lwp) WRITE(numout,*)'adatrj     = ',adatrj 
     193            IF(lwp) WRITE(numout,*)'ztime      = ',ztime 
     194            IF(lwp) WRITE(numout,*)'zdaymax    = ',zdaymax 
     195    
     196            IF(lwp) WRITE(numout,*)'ztimemax   = ',ztimemax 
     197            IF(lwp) WRITE(numout,*)'ztimemin   = ',ztimemin 
     198            IF(lwp) WRITE(numout,*)'zyear0     = ', zyear0 
     199            IF(lwp) WRITE(numout,*)'zmonth0    = ', zmonth0 
     200            IF(lwp) WRITE(numout,*)'zday0      = ', zday0 
     201            IF(lwp) WRITE(numout,*)'zday_year0 = ',zday_year0 
     202            IF(lwp) WRITE(numout,*)'nobis(2)', nobis(2) 
     203            IF(lwp) WRITE(numout,*)'nobis(5)', nobis(5) 
     204            IF(lwp) WRITE(numout,*)'nobis(6)', nobis(6) 
     205            IF(lwp) WRITE(numout,*)'nobis(1)', nobis(1) 
     206            IF(lwp) WRITE(numout,*)'nobis(zmonth0 -1)', nobis(zmonth0 - 1) 
     207            IF(lwp) WRITE(numout,*)'raajj  = ', raajj 
     208         ENDIF 
     209    
     210      ELSE 
     211 
     212         IF( kt == nit000 ) THEN 
     213    
     214            ! Read Namelist namtau : surface wind stress 
     215            ! -------------------- 
     216            REWIND ( numnam ) 
     217            READ   ( numnam, namtau ) 
     218    
     219            IF(lwp) WRITE(numout,*)' ' 
     220            IF(lwp) WRITE(numout,*)' tau     : Constant surface wind stress read in namelist' 
     221            IF(lwp) WRITE(numout,*)' ~~~~~~~ ' 
     222            IF(lwp) WRITE(numout,*)'           Namelist namtau: set the constant stress values' 
     223            IF(lwp) WRITE(numout,*)'              spin up of the stress  ntau000 = ', ntau000, ' time-steps' 
     224            IF(lwp) WRITE(numout,*)'              constant i-stress      tau0x   = ', tau0x  , ' N/m2' 
     225            IF(lwp) WRITE(numout,*)'              constant j-stress      tau0y   = ', tau0y  , ' N/m2' 
     226    
     227            ntau000 = MAX( ntau000, 1 )   ! must be >= 1 
     228    
     229         ENDIF 
     230    
     231         ! Increase the surface stress to its nominal value in ntau000 time-step 
     232          
     233         IF( kt <= ntau000 ) THEN 
     234            zfacto = 0.5 * (  1. - COS( rpi * FLOAT( kt ) / FLOAT( ntau000 ) )  ) 
     235            taux (:,:) = zfacto * tau0x 
     236            tauy (:,:) = zfacto * tau0y 
     237            tauxg(:,:) = zfacto * tau0x 
     238            tauyg(:,:) = zfacto * tau0y 
     239         ENDIF 
     240 
    142241      ENDIF 
    143242       
  • trunk/NEMO/OPA_SRC/in_out_manager.F90

    r88 r93  
    2525      nleapy = 0        ,    &  !: Leap year calendar flag (0/1 or 30) 
    2626      ninist = 0                !: initial state output flag (0/1) 
     27      nbench = 1                !: benchmark parameter (0/1) 
    2728   !!---------------------------------------------------------------------- 
    2829   !!                          Run control   
  • trunk/NEMO/OPA_SRC/istate.F90

    r79 r93  
    1010   !!   istate_sal    : analytical profile for initial Salinity 
    1111   !!   istate_eel    : initial state setting of EEL R5 configuration 
     12   !!   istate_gyre   : initial state setting of GYRE configuration 
    1213   !!   istate_uvg    : initial velocity in geostropic balance 
    1314   !!---------------------------------------------------------------------- 
     
    9899         adatrj = 0._wp 
    99100         IF( cp_cfg == 'eel' ) THEN 
    100             CALL istate_eel                      ! EEL configuration : start from pre-defined 
    101             !                                    !                     velocity and thermohaline fields 
     101            CALL istate_eel                      ! EEL   configuration : start from pre-defined 
     102            !                                    !                       velocity and thermohaline fields 
     103         ELSEIF(  cp_cfg == 'gyre') THEN          
     104            CALL istate_gyre                     ! GYRE  configuration : start from pre-defined temperature 
     105            !                                    !                       and salinity fields  
    102106         ELSE 
    103          !                                       ! Initial temperature and salinity fields 
     107         !                                       ! Other configurations: Initial temperature and salinity fields 
    104108#if defined key_dtatem 
    105109            CALL dta_tem( nit000 )                  ! read 3D temperature data 
     
    375379 
    376380 
     381   SUBROUTINE istate_gyre 
     382      !!---------------------------------------------------------------------- 
     383      !!                   ***  ROUTINE istate_gyre  *** 
     384      !!  
     385      !! ** Purpose :   Initialization of the dynamics and tracers for GYRE 
     386      !!      configuration (double gyre with rotated domain) 
     387      !! 
     388      !! ** Method  : - set temprature field 
     389      !!              - set salinity field 
     390      !! 
     391      !! ** History :                                      
     392      !!      9.0  !  04-05  (A. Koch-Larrouy)  Original code  
     393      !!---------------------------------------------------------------------- 
     394      !! * Local variables 
     395      INTEGER :: ji, jj, jk     ! dummy loop indices 
     396      !!---------------------------------------------------------------------- 
     397 
     398      IF(lwp) WRITE(numout,*) 
     399      IF(lwp) WRITE(numout,*) 'istate_gyre : initial analytical T and S profil deduced from LEVITUS ' 
     400      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     401 
     402      DO jk = 1, jpk 
     403         DO jj = 1, jpj 
     404            DO ji = 1, jpi 
     405               tn(ji,jj,jk) = (  16. - 12. * TANH( (fsdept(ji,jj,jk) - 400) / 700 )         )   & 
     406                    &           * (-TANH( (500-fsdept(ji,jj,jk)) / 150 ) + 1) / 2               & 
     407                    &       + (      15. * ( 1. - TANH( (fsdept(ji,jj,jk)-50.) / 1500.) )       & 
     408                    &                - 1.4 * TANH((fsdept(ji,jj,jk)-100.) / 100.)               &     
     409                    &                + 7.  * (1500. - fsdept(ji,jj,jk)) / 1500.             )   &  
     410                    &           * (-TANH( (fsdept(ji,jj,jk) - 500) / 150) + 1) / 2 
     411               tn(ji,jj,jk) = tn(ji,jj,jk) * tmask(ji,jj,jk) 
     412               tb(ji,jj,jk) = tn(ji,jj,jk) 
     413 
     414               sn(ji,jj,jk) =  (  36.25 - 1.13 * TANH( (fsdept(ji,jj,jk) - 305) / 460 )  )  & 
     415                  &              * (-TANH((500 - fsdept(ji,jj,jk)) / 150) + 1) / 2          & 
     416                  &          + (  35.55 + 1.25 * (5000. - fsdept(ji,jj,jk)) / 5000.         & 
     417                  &                - 1.62 * TANH( (fsdept(ji,jj,jk) - 60.  ) / 650. )       & 
     418                  &                + 0.2  * TANH( (fsdept(ji,jj,jk) - 35.  ) / 100. )       & 
     419                  &                + 0.2  * TANH( (fsdept(ji,jj,jk) - 1000.) / 5000.)    )  & 
     420                  &              * (-TANH((fsdept(ji,jj,jk) - 500) / 150) + 1) / 2  
     421               sn(ji,jj,jk) = sn(ji,jj,jk) * tmask(ji,jj,jk) 
     422               sb(ji,jj,jk) = sn(ji,jj,jk) 
     423            END DO 
     424         END DO 
     425      END DO 
     426 
     427      IF(lwp) THEN 
     428         WRITE(numout,*) 
     429         WRITE(numout,*) '              Initial temperature and salinity profiles:' 
     430         WRITE(numout, "(9x,' level   gdept   temperature   salinity   ')" ) 
     431         WRITE(numout, "(10x, i4, 3f10.2)" ) ( jk, gdept(jk), tn(2,2,jk), sn(2,2,jk), jk = 1, jpk ) 
     432      ENDIF 
     433 
     434      
     435   END SUBROUTINE istate_gyre 
     436 
     437 
     438 
    377439   SUBROUTINE istate_uvg 
    378440      !!---------------------------------------------------------------------- 
  • trunk/NEMO/OPA_SRC/par_oce.F90

    r56 r93  
    7171   !!--------------------------------------------------------------------- 
    7272#             include "par_EEL_R6.h90" 
     73#elif defined key_gyre 
     74   !!--------------------------------------------------------------------- 
     75   !!   'key_gyre'      :                         midlatidude basin : GYRE 
     76   !!--------------------------------------------------------------------- 
     77#             include "par_GYRE.h90" 
    7378#else 
    7479   !!--------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.