Changeset 2336 for LMDZ5/trunk


Ignore:
Timestamp:
Jul 31, 2015, 7:22:21 PM (9 years ago)
Author:
dcugnet
Message:
  • Add parallel capability for ce0l.
  • Small bug in grid_noro fixed (smoothed topography was used instead of unsmoothed one for geopotential computation at north pole).
  • Removed average of mass at poles in etat0dyn_netcdf after start_init_dyn => different results in the zoomed grid case.
  • ok_etat0=n and ok_limit=y combination now works fine (if no initial state is needed, but only limit.nc file). This required:
    • to move grid_noro0 and start_init_noro0 subroutines from etat0dyn_netcdf.F90 to limit_netcdf.F90
    • to create init_ssrf_m.F90 file, so that sub-surfaces can be initialized from limit_netcdf.F90 without any etat0*_netcdf routines call).
  • Simplified somehow the corresponding code, in particular: 1) removed obsolete flags "oldice". 2) removed flag "ibar": barycentric interpolation is used everywhere (except in start_init_subsurf, still calling grille_m - to be changed soon). 3) removed useless CPP_PHY precompilation directives, considering the possibility to run ce0l without physics is useless (ce0l is dedicated to Earth physics).
Location:
LMDZ5/trunk
Files:
2 deleted
6 edited
16 moved

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/dyn3d_common/caldyn0.F90

    r2334 r2336  
    1 SUBROUTINE caldyn0(itau,ucov,vcov,teta,ps,pk,phis,phi,w,time)
     1SUBROUTINE caldyn0(itau,ucov,vcov,teta,ps,masse,pk,phis,phi,w,pbaru,pbarv,time)
    22!
    33!-------------------------------------------------------------------------------
     
    1515!===============================================================================
    1616! Arguments:
    17   INTEGER, INTENT(IN)  :: itau                      !---
     17  INTEGER, INTENT(IN)  :: itau                      !--- TIME STEP INDEX
    1818  REAL,    INTENT(IN)  :: vcov (ip1jm    ,llm)      !--- V COVARIANT WIND
    1919  REAL,    INTENT(IN)  :: ucov (ip1jmp1  ,llm)      !--- U COVARIANT WIND
    2020  REAL,    INTENT(IN)  :: teta (ip1jmp1  ,llm)      !--- POTENTIAL TEMPERATURE
    2121  REAL,    INTENT(IN)  :: ps   (ip1jmp1)            !--- GROUND PRESSURE
     22  REAL,    INTENT(OUT) :: masse(ip1jmp1  ,llm)      !--- MASS IN EACH CELL
    2223  REAL,    INTENT(IN)  :: pk   (iip1,jjp1,llm)      !--- PRESSURE
    2324  REAL,    INTENT(IN)  :: phis (ip1jmp1)            !--- GROUND GEOPOTENTIAL
    2425  REAL,    INTENT(IN)  :: phi  (ip1jmp1  ,llm)      !--- 3D GEOPOTENTIAL
    2526  REAL,    INTENT(OUT) :: w    (ip1jmp1  ,llm)      !--- VERTICAL WIND
     27  REAL,    INTENT(OUT) :: pbaru(ip1jmp1  ,llm)      !--- U MASS FLUX
     28  REAL,    INTENT(OUT) :: pbarv(ip1jm    ,llm)      !--- V MASS FLUX
    2629  REAL,    INTENT(IN)  :: time                      !--- TIME
    2730!===============================================================================
    2831! Local variables:
    29   REAL masse(ip1jmp1  ,llm)      !--- MASS IN EACH CELL
    30   REAL pbaru(ip1jmp1  ,llm)      !--- U MASS FLUX
    31   REAL pbarv(ip1jm    ,llm)      !--- V MASS FLUX
    3232  REAL, DIMENSION(ip1jmp1,llmp1) :: p
    3333  REAL, DIMENSION(ip1jmp1,llm)   :: ucont, massebx, ang, ecin, convm, bern
  • LMDZ5/trunk/libf/dyn3d_common/convmas.F90

    r2335 r2336  
     1SUBROUTINE convmas (pbaru, pbarv, convm)
    12!
    2 ! $Header$
    3 !
    4       SUBROUTINE convmas (pbaru, pbarv, convm )
    5 c
    6       IMPLICIT NONE
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute mass flux convergence at p levels.
     7  IMPLICIT NONE
     8  include "dimensions.h"
     9  include "paramet.h"
     10  include "comgeom.h"
     11  include "logic.h"
     12!===============================================================================
     13! Arguments:
     14  REAL, INTENT(IN)  :: pbaru(ip1jmp1,llm)
     15  REAL, INTENT(IN)  :: pbarv(ip1jm  ,llm)
     16  REAL, INTENT(OUT) :: convm(ip1jmp1,llm)
     17!===============================================================================
     18! Method used:   Computation from top to bottom.
     19!   Mass convergence at level llm is equal to zero and is not stored in convm.
     20!===============================================================================
     21! Local variables:
     22  INTEGER :: l
     23!===============================================================================
    724
    8 c=======================================================================
    9 c
    10 c   Auteurs:  P. Le Van , F. Hourdin  .
    11 c   -------
    12 c
    13 c   Objet:
    14 c   ------
    15 c
    16 c   ********************************************************************
    17 c   .... calcul de la convergence du flux de masse aux niveaux p ...
    18 c   ********************************************************************
    19 c
    20 c
    21 c     pbaru  et  pbarv  sont des arguments d'entree pour le s-pg  ....
    22 c      .....  convm      est  un argument de sortie pour le s-pg  ....
    23 c
    24 c    le calcul se fait de haut en bas,
    25 c    la convergence de masse au niveau p(llm+1) est egale a 0. et
    26 c    n'est pas stockee dans le tableau convm .
    27 c
    28 c
    29 c=======================================================================
    30 c
    31 c   Declarations:
    32 c   -------------
     25!--- Computation of - (d(pbaru)/dx + d(pbarv)/dy )
     26  CALL convflu( pbaru, pbarv, llm, convm )
    3327
    34 #include "dimensions.h"
    35 #include "paramet.h"
    36 #include "comvert.h"
    37 #include "logic.h"
     28!--- Filter
     29  CALL filtreg( convm, jjp1, llm, 2, 2, .TRUE., 1 )
    3830
    39       REAL pbaru( ip1jmp1,llm ),pbarv( ip1jm,llm ),convm(  ip1jmp1,llm )
    40       INTEGER   l,ij
     31!--- Mass convergence is integrated from top to bottom
     32  DO l=llmm1,1,-1
     33    convm(:,l) = convm(:,l) + convm(:,l+1)
     34  END DO
    4135
    42 
    43 c-----------------------------------------------------------------------
    44 c    ....  calcul de - (d(pbaru)/dx + d(pbarv)/dy ) ......
    45 
    46       CALL  convflu( pbaru, pbarv, llm, convm )
    47 
    48 c-----------------------------------------------------------------------
    49 c   filtrage:
    50 c   ---------
    51 
    52        CALL filtreg( convm, jjp1, llm, 2, 2, .true., 1 )
    53 
    54 c    integration de la convergence de masse de haut  en bas ......
    55 
    56       DO      l      = llmm1, 1, -1
    57         DO    ij     = 1, ip1jmp1
    58          convm(ij,l) = convm(ij,l) + convm(ij,l+1)
    59         ENDDO
    60       ENDDO
    61 c
    62       RETURN
    63       END
     36END SUBROUTINE convmas
  • LMDZ5/trunk/libf/dyn3d_common/enercin.F90

    r2335 r2336  
     1SUBROUTINE enercin ( vcov, ucov, vcont, ucont, ecin )
    12!
    2 ! $Header$
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute kinetic energy at sigma levels.
     7  IMPLICIT NONE
     8  include "dimensions.h"
     9  include "paramet.h"
     10  include "comgeom.h"
     11!===============================================================================
     12! Arguments:
     13  REAL, INTENT(IN)  :: vcov    (ip1jm,  llm)
     14  REAL, INTENT(IN)  :: ucov    (ip1jmp1,llm)
     15  REAL, INTENT(IN)  :: vcont   (ip1jm,  llm)
     16  REAL, INTENT(IN)  :: ucont   (ip1jmp1,llm)
     17  REAL, INTENT(OUT) :: ecin    (ip1jmp1,llm)
     18!===============================================================================
     19! Notes:
     20!                 . V
     21!                i,j-1
    322!
    4       SUBROUTINE enercin ( vcov, ucov, vcont, ucont, ecin )
    5       IMPLICIT NONE
     23!      alpha4 .       . alpha1
     24!
     25!
     26!        U .      . P     . U
     27!       i-1,j    i,j      i,j
     28!
     29!      alpha3 .       . alpha2
     30!
     31!
     32!                 . V
     33!                i,j
     34!
     35! Kinetic energy at scalar point P(i,j) (excluding poles) is:
     36!       Ecin = 0.5 * U(i-1,j)**2 *( alpha3 + alpha4 )  +
     37!              0.5 * U(i  ,j)**2 *( alpha1 + alpha2 )  +
     38!              0.5 * V(i,j-1)**2 *( alpha1 + alpha4 )  +
     39!              0.5 * V(i,  j)**2 *( alpha2 + alpha3 )
     40!===============================================================================
     41! Local variables:
     42  INTEGER :: l, ij, i
     43  REAL    :: ecinni(iip1), ecinsi(iip1), ecinpn, ecinps
     44!===============================================================================
     45  DO l=1,llm
     46    DO ij = iip2, ip1jm -1
     47      ecin(ij+1,l)=0.5*(ucov(ij    ,l)*ucont(ij    ,l)*alpha3p4(ij +1)          &
     48                      + ucov(ij+1  ,l)*ucont(ij+1  ,l)*alpha1p2(ij +1)          &
     49                      + vcov(ij-iim,l)*vcont(ij-iim,l)*alpha1p4(ij +1)          &
     50                      + vcov(ij+1  ,l)*vcont(ij+1  ,l)*alpha2p3(ij +1) )
     51    END DO
     52    !--- Correction: ecin(1,j,l)= ecin(iip1,j,l)
     53    DO ij=iip2,ip1jm,iip1; ecin(ij,l) = ecin(ij+iim,l); END DO
    654
    7 c=======================================================================
    8 c
    9 c   Auteur: P. Le Van
    10 c   -------
    11 c
    12 c   Objet:
    13 c   ------
    14 c
    15 c *********************************************************************
    16 c .. calcul de l'energie cinetique aux niveaux s  ......
    17 c *********************************************************************
    18 c  vcov, vcont, ucov et ucont sont des arguments d'entree pour le s-pg .
    19 c  ecin         est  un  argument de sortie pour le s-pg
    20 c
    21 c=======================================================================
     55    !--- North pole
     56    DO i=1,iim
     57      ecinni(i) = vcov(i,l)*vcont(i,l)*aire(i)
     58    END DO
     59    ecinpn = 0.5*SUM(ecinni(1:iim))/apoln
     60    DO ij=1,iip1; ecin(ij,l)=ecinpn; END DO
    2261
    23 #include "dimensions.h"
    24 #include "paramet.h"
    25 #include "comgeom.h"
     62    !--- South pole
     63    DO i=1,iim
     64      ecinsi(i) = vcov(i+ip1jmi1,l)*vcont(i+ip1jmi1,l)*aire(i+ip1jm)
     65    END DO
     66    ecinps = 0.5*SUM(ecinsi(1:iim))/apols
     67    DO ij=1,iip1; ecin(ij+ip1jm,l)=ecinps; END DO
     68  END DO
    2669
    27       REAL vcov( ip1jm,llm ),vcont( ip1jm,llm ),
    28      * ucov( ip1jmp1,llm ),ucont( ip1jmp1,llm ),ecin( ip1jmp1,llm )
     70END SUBROUTINE enercin
    2971
    30       REAL ecinni( iip1 ),ecinsi( iip1 )
    31 
    32       REAL ecinpn, ecinps
    33       INTEGER     l,ij,i
    34 
    35       REAL        SSUM
    36 
    37 
    38 
    39 c                 . V
    40 c                i,j-1
    41 
    42 c      alpha4 .       . alpha1
    43 
    44 
    45 c        U .      . P     . U
    46 c       i-1,j    i,j      i,j
    47 
    48 c      alpha3 .       . alpha2
    49 
    50 
    51 c                 . V
    52 c                i,j
    53 
    54 c   
    55 c  L'energie cinetique au point scalaire P(i,j) ,autre que les poles, est :
    56 c       Ecin = 0.5 * U(i-1,j)**2 *( alpha3 + alpha4 )  +
    57 c              0.5 * U(i  ,j)**2 *( alpha1 + alpha2 )  +
    58 c              0.5 * V(i,j-1)**2 *( alpha1 + alpha4 )  +
    59 c              0.5 * V(i,  j)**2 *( alpha2 + alpha3 )
    60 
    61 
    62       DO 5 l = 1,llm
    63 
    64       DO 1  ij = iip2, ip1jm -1
    65       ecin( ij+1, l )  =    0.5  *
    66      * (   ucov( ij   ,l ) * ucont( ij   ,l ) * alpha3p4( ij +1 )   +
    67      *     ucov( ij+1 ,l ) * ucont( ij+1 ,l ) * alpha1p2( ij +1 )   +
    68      *     vcov(ij-iim,l ) * vcont(ij-iim,l ) * alpha1p4( ij +1 )   +
    69      *     vcov( ij+ 1,l ) * vcont( ij+ 1,l ) * alpha2p3( ij +1 )   )
    70    1  CONTINUE
    71 
    72 c    ... correction pour  ecin(1,j,l)  ....
    73 c    ...   ecin(1,j,l)= ecin(iip1,j,l) ...
    74 
    75 CDIR$ IVDEP
    76       DO 2 ij = iip2, ip1jm, iip1
    77       ecin( ij,l ) = ecin( ij + iim, l )
    78    2  CONTINUE
    79 
    80 c     calcul aux poles  .......
    81 
    82 
    83       DO 3 i = 1, iim
    84       ecinni(i) = vcov(    i  ,  l) * vcont(    i    ,l) * aire(   i   )
    85       ecinsi(i) = vcov(i+ip1jmi1,l) * vcont(i+ip1jmi1,l) * aire(i+ip1jm)
    86    3  CONTINUE
    87 
    88       ecinpn = 0.5 * SSUM( iim,ecinni,1 ) / apoln
    89       ecinps = 0.5 * SSUM( iim,ecinsi,1 ) / apols
    90 
    91       DO 4 ij = 1,iip1
    92       ecin(   ij     , l ) = ecinpn
    93       ecin( ij+ ip1jm, l ) = ecinps
    94    4  CONTINUE
    95 
    96    5  CONTINUE
    97       RETURN
    98       END
  • LMDZ5/trunk/libf/dyn3d_common/flumass.F90

    r2335 r2336  
     1SUBROUTINE flumass (massebx,masseby, vcont, ucont, pbaru, pbarv )
    12!
    2 ! $Header$
    3 !
    4       SUBROUTINE flumass (massebx,masseby, vcont, ucont, pbaru, pbarv )
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute mass flux at s levels.
     7  IMPLICIT NONE
     8  include "dimensions.h"
     9  include "paramet.h"
     10  include "comgeom.h"
     11!===============================================================================
     12! Arguments:
     13  REAL, INTENT(IN)  :: massebx(ip1jmp1,llm)
     14  REAL, INTENT(IN)  :: masseby(ip1jm  ,llm)
     15  REAL, INTENT(IN)  :: vcont  (ip1jm  ,llm)
     16  REAL, INTENT(IN)  :: ucont  (ip1jmp1,llm)
     17  REAL, INTENT(OUT) :: pbaru  (ip1jmp1,llm)
     18  REAL, INTENT(OUT) :: pbarv  (ip1jm  ,llm)
     19!===============================================================================
     20! Method used:   A 2 equations system is solved.
     21!   * 1st one describes divergence computation at pole point nr. i (i=1 to im):
     22!     (0.5*(pbaru(i)-pbaru(i-1))-pbarv(i))/aire(i) = - SUM(pbarv(n))/aire pole
     23!   * 2nd one specifies that mean mass flux at pole is equal to 0:
     24!     SUM(pbaru(n)*local_area(n))=0
     25! This way, we determine additive constant common to pbary elements representing
     26!   pbaru(0,j,l) in divergence computation equation for point i=1. (i=1 to im)
     27!===============================================================================
     28! Local variables:
     29  REAL    :: sairen, saireun, ctn, ctn0, apbarun(iip1)
     30  REAL    :: saires, saireus, cts, cts0, apbarus(iip1)
     31  INTEGER :: l, i
     32!===============================================================================
     33  DO l=1,llm
     34    pbaru(iip2:ip1jm,l)=massebx(iip2:ip1jm,l)*ucont(iip2:ip1jm,l)
     35    pbarv(   1:ip1jm,l)=masseby(   1:ip1jm,l)*vcont(   1:ip1jm,l)
     36  END DO
    537
    6       IMPLICIT NONE
     38  !--- NORTH POLE
     39  sairen =SUM(aire (1:iim))
     40  saireun=SUM(aireu(1:iim))
     41  DO l = 1,llm
     42    ctn=SUM(pbarv(1:iim,l))/sairen
     43    pbaru(1,l)= pbarv(1,l)-ctn*aire(1)
     44    DO i=2,iim
     45      pbaru(i,l)=pbaru(i-1,l)+pbarv(i,l)-ctn*aire(i)
     46    END DO
     47    DO i=1,iim
     48      apbarun(i)=aireu(i)*pbaru(i,l)
     49    END DO
     50    ctn0 = -SUM(apbarun(1:iim))/saireun
     51    DO i = 1,iim
     52      pbaru(i,l)=2.*(pbaru(i,l)+ctn0)
     53    END DO
     54    pbaru(iip1,l)=pbaru(1,l)
     55  END DO
    756
    8 c=======================================================================
    9 c
    10 c   Auteurs:  P. Le Van, F. Hourdin  .
    11 c   -------
    12 c
    13 c   Objet:
    14 c   ------
    15 c
    16 c *********************************************************************
    17 c     .... calcul du flux de masse  aux niveaux s ......
    18 c *********************************************************************
    19 c   massebx,masseby,vcont et ucont sont des argum. d'entree pour le s-pg .
    20 c       pbaru  et pbarv            sont des argum.de sortie pour le s-pg .
    21 c
    22 c=======================================================================
     57  !--- SOUTH POLE
     58  saires =SUM(aire (ip1jm+1:ip1jmp1-1))
     59  saireus=SUM(aireu(ip1jm+1:ip1jmp1-1))
     60  DO l = 1,llm
     61    cts=SUM(pbarv(ip1jmi1+1:ip1jm-1,l))/saires
     62    pbaru(1+ip1jm,l)=-pbarv(1+ip1jmi1,l)+cts*aire(1+ip1jm)
     63    DO i=2,iim
     64      pbaru(i+ip1jm,l)=pbaru(i-1+ip1jm,l)-pbarv(i+ip1jmi1,l)+cts*aire(i+ip1jm)
     65    END DO
     66    DO i=1,iim
     67      apbarus(i)=aireu(i+ip1jm)*pbaru(i+ip1jm,l)
     68    END DO
     69    cts0 = -SUM(apbarus(1:iim))/saireus
     70    DO i = 1,iim
     71      pbaru(i+ip1jm,l)=2.*(pbaru(i+ip1jm,l)+cts0)
     72    END DO
     73    pbaru(ip1jmp1,l)=pbaru(1+ip1jm,l)
     74  END DO
    2375
    24 
    25 #include "dimensions.h"
    26 #include "paramet.h"
    27 #include "comgeom.h"
    28 
    29       REAL massebx( ip1jmp1,llm ),masseby( ip1jm,llm ) ,
    30      * vcont( ip1jm,llm ),ucont( ip1jmp1,llm ),pbaru( ip1jmp1,llm ),
    31      * pbarv( ip1jm,llm )
    32 
    33       REAL apbarun( iip1 ),apbarus( iip1 )
    34 
    35       REAL sairen,saireun,saires,saireus,ctn,cts,ctn0,cts0
    36       INTEGER  l,ij,i
    37 
    38       REAL       SSUM
    39 
    40 
    41       DO  5 l = 1,llm
    42 
    43       DO  1 ij = iip2,ip1jm
    44       pbaru( ij,l ) = massebx( ij,l ) * ucont( ij,l )
    45    1  CONTINUE
    46 
    47       DO 3 ij = 1,ip1jm
    48       pbarv( ij,l ) = masseby( ij,l ) * vcont( ij,l )
    49    3  CONTINUE
    50 
    51    5  CONTINUE
    52 
    53 c    ................................................................
    54 c     calcul de la composante du flux de masse en x aux poles .......
    55 c    ................................................................
    56 c     par la resolution d'1 systeme de 2 equations .
    57 
    58 c     la premiere equat.decrivant le calcul de la divergence en 1 point i
    59 c     du pole,ce calcul etant itere de i=1 a i=im .
    60 c                 c.a.d   ,
    61 c     ( ( 0.5*pbaru(i)-0.5*pbaru(i-1) - pbarv(i))/aire(i)   =
    62 c                                           - somme de ( pbarv(n) )/aire pole
    63 
    64 c     l'autre equat.specifiant que la moyenne du flux de masse au pole est =0.
    65 c     c.a.d    somme de pbaru(n)*aire locale(n) = 0.
    66 
    67 c     on en revient ainsi a determiner la constante additive commune aux pbaru
    68 c     qui representait pbaru(0,j,l) dans l'equat.du calcul de la diverg.au pt
    69 c     i=1 .
    70 c     i variant de 1 a im
    71 c     n variant de 1 a im
    72 
    73       sairen = SSUM( iim,  aire(   1     ), 1 )
    74       saireun= SSUM( iim, aireu(   1     ), 1 )
    75       saires = SSUM( iim,  aire( ip1jm+1 ), 1 )
    76       saireus= SSUM( iim, aireu( ip1jm+1 ), 1 )
    77 
    78       DO 20 l = 1,llm
    79 
    80       ctn =  SSUM( iim, pbarv(    1     ,l),  1 )/ sairen
    81       cts =  SSUM( iim, pbarv(ip1jmi1+ 1,l),  1 )/ saires
    82 
    83       pbaru(    1   ,l )=   pbarv(    1     ,l ) - ctn * aire(    1    )
    84       pbaru( ip1jm+1,l )= - pbarv( ip1jmi1+1,l ) + cts * aire( ip1jm+1 )
    85 
    86       DO 11 i = 2,iim
    87       pbaru(    i    ,l ) = pbaru(   i - 1   ,l )    +
    88      *                      pbarv(    i      ,l ) - ctn * aire(   i    )
    89 
    90       pbaru( i+ ip1jm,l ) = pbaru( i+ ip1jm-1,l )    -
    91      *                      pbarv( i+ ip1jmi1,l ) + cts * aire(i+ ip1jm)
    92   11  CONTINUE
    93       DO 12 i = 1,iim
    94       apbarun(i) = aireu(    i   ) * pbaru(   i    , l)
    95       apbarus(i) = aireu(i +ip1jm) * pbaru(i +ip1jm, l)
    96   12  CONTINUE
    97       ctn0 = -SSUM( iim,apbarun,1 )/saireun
    98       cts0 = -SSUM( iim,apbarus,1 )/saireus
    99       DO 14 i = 1,iim
    100       pbaru(   i    , l) = 2. * ( pbaru(   i    , l) + ctn0 )
    101       pbaru(i+ ip1jm, l) = 2. * ( pbaru(i +ip1jm, l) + cts0 )
    102   14  CONTINUE
    103 
    104       pbaru(   iip1 ,l ) = pbaru(    1    ,l )
    105       pbaru( ip1jmp1,l ) = pbaru( ip1jm +1,l )
    106   20  CONTINUE
    107 
    108       RETURN
    109       END
     76END SUBROUTINE flumass
  • LMDZ5/trunk/libf/dyn3d_common/massbar.F90

    r2335 r2336  
     1SUBROUTINE massbar(masse,massebx,masseby)
    12!
    2 ! $Header$
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute air mass mean along X and Y in each cell.
     7! See iniconst for more details.
     8  IMPLICIT NONE
     9  include "dimensions.h"
     10  include "paramet.h"
     11  include "comgeom.h"
     12!===============================================================================
     13! Arguments:
     14  REAL, INTENT(IN)  :: masse  (ip1jmp1,llm)
     15  REAL, INTENT(OUT) :: massebx(ip1jmp1,llm)
     16  REAL, INTENT(OUT) :: masseby(ip1jm  ,llm)
     17!-------------------------------------------------------------------------------
     18! Method used. Each scalar point is associated to 4 area coefficients:
     19!    * alpha1(i,j) at point ( i+1/4,j-1/4 )
     20!    * alpha2(i,j) at point ( i+1/4,j+1/4 )
     21!    * alpha3(i,j) at point ( i-1/4,j+1/4 )
     22!    * alpha4(i,j) at point ( i-1/4,j-1/4 )
     23! where alpha1(i,j) = aire(i+1/4,j-1/4)/ aire(i,j)
    324!
    4       SUBROUTINE massbar(  masse, massebx, masseby )
    5       IMPLICIT NONE
    6 c
    7 c **********************************************************************
    8 c
    9 c  Calcule les moyennes en x et  y de la masse d'air dans chaque maille.
    10 c **********************************************************************
    11 c    Auteurs : P. Le Van , Fr. Hourdin  .
    12 c   ..........
    13 c
    14 c  ..  masse                 est  un argum. d'entree  pour le s-pg ...
    15 c  ..  massebx,masseby      sont des argum. de sortie pour le s-pg ...
    16 c     
    17 c
    18 c     IMPLICIT NONE
    19 c
    20 #include "dimensions.h"
    21 #include "paramet.h"
    22 #include "comconst.h"
    23 #include "comgeom.h"
    24 c
    25       REAL    masse( ip1jmp1,llm ), massebx( ip1jmp1,llm )  ,
    26      *      masseby(   ip1jm,llm )
    27       INTEGER ij,l
    28 c
    29 c
    30 c   Methode pour calculer massebx et masseby .
    31 c   ----------------------------------------
    32 c
    33 c    A chaque point scalaire P (i,j) est affecte 4 coefficients d'aires
    34 c       alpha1(i,j)  calcule  au point ( i+1/4,j-1/4 )
    35 c       alpha2(i,j)  calcule  au point ( i+1/4,j+1/4 )
    36 c       alpha3(i,j)  calcule  au point ( i-1/4,j+1/4 )
    37 c       alpha4(i,j)  calcule  au point ( i-1/4,j-1/4 )
    38 c
    39 c    Avec  alpha1(i,j) = aire(i+1/4,j-1/4)/ aire(i,j)       
    40 c
    41 c    N.B .  Pour plus de details, voir s-pg  ...  iniconst ...
    42 c
    43 c
    44 c
    45 c   alpha4 .         . alpha1    . alpha4
    46 c    (i,j)             (i,j)       (i+1,j)
    47 c
    48 c             P .        U .          . P
    49 c           (i,j)       (i,j)         (i+1,j)
    50 c
    51 c   alpha3 .         . alpha2    .alpha3
    52 c    (i,j)              (i,j)     (i+1,j)
    53 c
    54 c             V .        Z .          . V
    55 c           (i,j)
    56 c
    57 c   alpha4 .         . alpha1    .alpha4
    58 c   (i,j+1)            (i,j+1)   (i+1,j+1)
    59 c
    60 c             P .        U .          . P
    61 c          (i,j+1)                    (i+1,j+1)
    62 c
    63 c
    64 c
    65 c                       On  a :
    66 c
    67 c    massebx(i,j) = masse(i  ,j) * ( alpha1(i  ,j) + alpha2(i,j))   +
    68 c                   masse(i+1,j) * ( alpha3(i+1,j) + alpha4(i+1,j) )
    69 c     localise  au point  ... U (i,j) ...
    70 c
    71 c    masseby(i,j) = masse(i,j  ) * ( alpha2(i,j  ) + alpha3(i,j  )  +
    72 c                   masse(i,j+1) * ( alpha1(i,j+1) + alpha4(i,j+1) 
    73 c     localise  au point  ... V (i,j) ...
    74 c
    75 c
    76 c=======================================================================
     25!   alpha4 .         . alpha1    . alpha4
     26!    (i,j)             (i,j)       (i+1,j)
     27!
     28!             P .        U .          . P
     29!           (i,j)       (i,j)         (i+1,j)
     30!
     31!   alpha3 .         . alpha2    .alpha3
     32!    (i,j)              (i,j)     (i+1,j)
     33!
     34!             V .        Z .          . V
     35!           (i,j)
     36!
     37!   alpha4 .         . alpha1    .alpha4
     38!   (i,j+1)            (i,j+1)   (i+1,j+1)
     39!
     40!             P .        U .          . P
     41!          (i,j+1)                    (i+1,j+1)
     42!
     43!
     44!    massebx(i,j) = masse(i  ,j) * ( alpha1(i  ,j) + alpha2(i,j))   +
     45!                   masse(i+1,j) * ( alpha3(i+1,j) + alpha4(i+1,j) )
     46!     localized at point  ... U (i,j) ...
     47!
     48!    masseby(i,j) = masse(i,j  ) * ( alpha2(i,j  ) + alpha3(i,j  )  +
     49!                   masse(i,j+1) * ( alpha1(i,j+1) + alpha4(i,j+1) 
     50!     localized at point  ... V (i,j) ...
     51!===============================================================================
     52! Local variables:
     53  INTEGER :: ij, l
     54!===============================================================================
     55  DO l=1,llm
     56    DO ij=1,ip1jmp1-1
     57      massebx(ij,l)=masse(ij,l)*alpha1p2(ij)+masse(ij+1   ,l)*alpha3p4(ij+1)
     58    END DO
     59    DO ij=iip1,ip1jmp1,iip1; massebx(ij,l)=massebx(ij-iim,l); END DO
     60    DO ij=1,ip1jm
     61      masseby(ij,l)=masse(ij,l)*alpha2p3(ij)+masse(ij+iip1,l)*alpha1p4(ij+iip1)
     62    END DO
     63  END DO
    7764
    78       DO   100    l = 1 , llm
    79 c
    80         DO  ij = 1, ip1jmp1 - 1
    81          massebx(ij,l) =  masse( ij, l) * alpha1p2( ij  )     +
    82      *                   masse(ij+1, l) * alpha3p4(ij+1 )
    83         ENDDO
     65END SUBROUTINE massbar
    8466
    85 c    .... correction pour massebx( iip1,j) .....
    86 c    ...    massebx(iip1,j)= massebx(1,j) ...
    87 c
    88 CDIR$ IVDEP
    89         DO  ij = iip1, ip1jmp1, iip1
    90          massebx( ij,l ) = massebx( ij - iim,l )
    91         ENDDO
    92 
    93 
    94          DO  ij = 1,ip1jm
    95          masseby( ij,l ) = masse(  ij   , l ) * alpha2p3(   ij    )  +
    96      *                     masse(ij+iip1, l ) * alpha1p4( ij+iip1 )
    97          ENDDO
    98 
    99 100   CONTINUE
    100 c
    101       RETURN
    102       END
  • LMDZ5/trunk/libf/dyn3d_common/massbarxy.F90

    r2335 r2336  
     1SUBROUTINE massbarxy(masse,massebxy)
    12!
    2 ! $Header$
    3 !
    4       SUBROUTINE massbarxy(  masse, massebxy )
    5       IMPLICIT NONE
    6 c
    7 c **********************************************************************
    8 c
    9 c  Calcule les moyennes en x et  y de la masse d'air dans chaque maille.
    10 c **********************************************************************
    11 c    Auteurs : P. Le Van , Fr. Hourdin  .
    12 c   ..........
    13 c
    14 c  ..  masse          est  un  argum. d'entree  pour le s-pg ...
    15 c  ..  massebxy       est  un  argum. de sortie pour le s-pg ...
    16 c     
    17 c
    18 c     IMPLICIT NONE
    19 c
    20 #include "dimensions.h"
    21 #include "paramet.h"
    22 #include "comconst.h"
    23 #include "comgeom.h"
    24 c
    25        REAL  masse( ip1jmp1,llm ), massebxy( ip1jm,llm )
    26        INTEGER ij,l
    27 c
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute air mass mean along X and Y in each cell.
     7! See iniconst for more details.
     8  IMPLICIT NONE
     9  include "dimensions.h"
     10  include "paramet.h"
     11  include "comconst.h"
     12  include "comgeom.h"
     13!===============================================================================
     14! Arguments:
     15  REAL, INTENT(IN)  :: masse   (ip1jmp1,llm)
     16  REAL, INTENT(OUT) :: massebxy(ip1jm  ,llm)
     17!===============================================================================
     18! Local variables:
     19  INTEGER :: ij, l
     20!===============================================================================
     21  DO l=1,llm
     22    DO ij=1,ip1jm-1
     23      massebxy(ij,l)=masse(ij     ,l)*alpha2(ij     ) + &
     24     +               masse(ij+1   ,l)*alpha3(ij+1   ) + &
     25     +               masse(ij+iip1,l)*alpha1(ij+iip1) + &
     26     +               masse(ij+iip2,l)*alpha4(ij+iip2)
     27    END DO
     28    DO ij=iip1,ip1jm,iip1; massebxy(ij,l)=massebxy(ij-iim,l); END DO
     29  END DO
    2830
    29       DO   100    l = 1 , llm
    30 c
    31       DO 5 ij = 1, ip1jm - 1
    32       massebxy( ij,l ) = masse(    ij  ,l ) * alpha2(   ij    )   +
    33      +                   masse(   ij+1 ,l ) * alpha3(  ij+1   )   +
    34      +                   masse( ij+iip1,l ) * alpha1( ij+iip1 )   +
    35      +                   masse( ij+iip2,l ) * alpha4( ij+iip2 )
    36    5  CONTINUE
    37 
    38 c    ....  correction pour     massebxy( iip1,j )  ........
    39 
    40 CDIR$ IVDEP
    41 
    42       DO 7 ij = iip1, ip1jm, iip1
    43       massebxy( ij,l ) = massebxy( ij - iim,l )
    44    7  CONTINUE
    45 
    46 100   CONTINUE
    47 c
    48       RETURN
    49       END
     31END SUBROUTINE massbarxy
  • LMDZ5/trunk/libf/dyn3d_common/tourpot.F90

    r2335 r2336  
     1SUBROUTINE tourpot ( vcov, ucov, massebxy, vorpot )
    12!
    2 ! $Header$
    3 !
    4       SUBROUTINE tourpot ( vcov, ucov, massebxy, vorpot )
    5       IMPLICIT NONE
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute potential vorticity.
     7  IMPLICIT NONE
     8  include "dimensions.h"
     9  include "paramet.h"
     10  include "comgeom.h"
     11  include "logic.h"
     12!===============================================================================
     13! Arguments:
     14  REAL, INTENT(IN)  :: vcov    (ip1jm,  llm)
     15  REAL, INTENT(IN)  :: ucov    (ip1jmp1,llm)
     16  REAL, INTENT(IN)  :: massebxy(ip1jm,  llm)
     17  REAL, INTENT(OUT) :: vorpot  (ip1jm,  llm)
     18!===============================================================================
     19! Method used:
     20!   vorpot = ( Filtre( d(vcov)/dx - d(ucov)/dy ) + fext ) /psbarxy
     21!===============================================================================
     22! Local variables:
     23  INTEGER :: l, ij
     24  REAL    :: rot(ip1jm,llm)
     25!===============================================================================
    626
    7 c=======================================================================
    8 c
    9 c   Auteur:  P. Le Van
    10 c   -------
    11 c
    12 c   Objet:
    13 c   ------
    14 c
    15 c    *******************************************************************
    16 c    .........      calcul du tourbillon potentiel             .........
    17 c    *******************************************************************
    18 c
    19 c     vcov,ucov,fext et pbarxyfl sont des argum. d'entree pour le s-pg .
    20 c             vorpot            est  un argum.de sortie pour le s-pg .
    21 c
    22 c=======================================================================
     27!--- Wind vorticity ; correction: rot(iip1,j,l) = rot(1,j,l)
     28  DO l=1,llm
     29    DO ij=1,ip1jm-1
     30      rot(ij,l)=vcov(ij+1,l)-vcov(ij,l)+ucov(ij+iip1,l)-ucov(ij,l)
     31    END DO
     32    DO ij=iip1,ip1jm,iip1; rot(ij,l)=rot(ij-iim,l); END DO
     33  END DO
    2334
    24 #include "dimensions.h"
    25 #include "paramet.h"
    26 #include "comgeom.h"
    27 #include "logic.h"
     35!--- Filter
     36  CALL  filtreg(rot,jjm,llm,2,1,.FALSE.,1)
    2837
    29       REAL  rot( ip1jm,llm )
    30       REAL vcov( ip1jm,llm ),ucov( ip1jmp1,llm )
    31       REAL massebxy( ip1jm,llm ),vorpot( ip1jm,llm )
     38!--- Potential vorticity ; correction: rot(iip1,j,l) = rot(1,j,l)
     39  DO l=1,llm
     40    DO ij=1,ip1jm-1
     41      vorpot(ij,l)=(rot(ij,l)+fext(ij))/massebxy(ij,l)
     42    END DO
     43    DO ij=iip1,ip1jm,iip1; vorpot(ij,l)=vorpot(ij-iim,l); END DO
     44  END DO
    3245
    33       INTEGER l, ij
    34 
    35 
    36 
    37 
    38 c  ... vorpot = ( Filtre( d(vcov)/dx - d(ucov)/dy ) + fext ) /psbarxy ..
    39 
    40 
    41 
    42 c    ........  Calcul du rotationnel du vent V  puis filtrage  ........
    43 
    44       DO 5 l = 1,llm
    45 
    46       DO 2 ij = 1, ip1jm - 1
    47       rot( ij,l ) = vcov(ij+1,l)-vcov(ij,l)+ucov(ij+iip1,l)-ucov(ij,l)
    48    2  CONTINUE
    49 
    50 c    ....  correction pour  rot( iip1,j,l )  .....
    51 c    ....     rot(iip1,j,l) = rot(1,j,l)    .....
    52 
    53 CDIR$ IVDEP
    54 
    55       DO 3 ij = iip1, ip1jm, iip1
    56       rot( ij,l ) = rot( ij -iim, l )
    57    3  CONTINUE
    58 
    59    5  CONTINUE
    60 
    61 
    62       CALL  filtreg( rot, jjm, llm, 2, 1, .FALSE., 1 )
    63 
    64 
    65       DO 10 l = 1, llm
    66 
    67       DO 6 ij = 1, ip1jm - 1
    68       vorpot( ij,l ) = ( rot(ij,l) + fext(ij) ) / massebxy(ij,l)
    69    6  CONTINUE
    70 
    71 c    ..... correction pour  vorpot( iip1,j,l)  .....
    72 c    ....   vorpot(iip1,j,l)= vorpot(1,j,l) ....
    73 CDIR$ IVDEP
    74       DO 8 ij = iip1, ip1jm, iip1
    75       vorpot( ij,l ) = vorpot( ij -iim,l )
    76    8  CONTINUE
    77 
    78   10  CONTINUE
    79 
    80       RETURN
    81       END
     46END SUBROUTINE tourpot
  • LMDZ5/trunk/libf/dyn3d_common/vitvert.F90

    r2335 r2336  
     1SUBROUTINE vitvert (convm, w)
    12!
    2 ! $Header$
    3 !
    4       SUBROUTINE vitvert ( convm , w )
    5 c
    6       IMPLICIT NONE
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute vertical speed at sigma levels.
     7  IMPLICIT NONE
     8  include "dimensions.h"
     9  include "paramet.h"
     10  include "comvert.h"
     11!===============================================================================
     12! Arguments:
     13  REAL, INTENT(IN)  :: convm(ip1jmp1,llm)
     14  REAL, INTENT(OUT) :: w    (ip1jmp1,llm)
     15!===============================================================================
     16! Notes: Vertical speed is oriented from bottom to top.
     17!   * At ground - level sigma(1):     w(i,j,1) = 0.
     18!   * At top    - level sigma(llm+1): w(i,j,l) = 0. (not stored in w)
     19!===============================================================================
     20! Local variables:
     21  INTEGER :: l
     22!===============================================================================
     23  DO l=1,llmm1; w(:,l+1)=convm(:,l+1)-bp(l+1)*convm(:,1); END DO
     24  w(:,1)=0.
    725
    8 c=======================================================================
    9 c
    10 c   Auteurs:  P. Le Van , F. Hourdin .
    11 c   -------
    12 c
    13 c   Objet:
    14 c   ------
    15 c
    16 c    *******************************************************************
    17 c  .... calcul de la vitesse verticale aux niveaux sigma  ....
    18 c    *******************************************************************
    19 c     convm   est un argument  d'entree pour le s-pg  ......
    20 c       w     est un argument de sortie pour le s-pg  ......
    21 c
    22 c    la vitesse verticale est orientee de  haut en bas .
    23 c    au sol, au niveau sigma(1),   w(i,j,1) = 0.
    24 c    au sommet, au niveau sigma(llm+1) , la vit.verticale est aussi
    25 c    egale a 0. et n'est pas stockee dans le tableau w  .
    26 c
    27 c
    28 c=======================================================================
     26END SUBROUTINE vitvert
    2927
    30 #include "dimensions.h"
    31 #include "paramet.h"
    32 #include "comvert.h"
    33 
    34       REAL w(ip1jmp1,llm),convm(ip1jmp1,llm)
    35       INTEGER   l, ij
    36 
    37 
    38 
    39       DO 2  l = 1,llmm1
    40 
    41       DO 1 ij = 1,ip1jmp1
    42       w( ij, l+1 ) = convm( ij, l+1 ) - bp(l+1) * convm( ij, 1 )
    43    1  CONTINUE
    44 
    45    2  CONTINUE
    46 
    47       DO 5 ij  = 1,ip1jmp1
    48       w(ij,1)  = 0.
    49 5     CONTINUE
    50 
    51       RETURN
    52       END
  • LMDZ5/trunk/libf/dyn3dmem/convmas1_loc.F90

    r2335 r2336  
    1       SUBROUTINE convmas1_loc (pbaru, pbarv, convm )
    2 c
    3       USE parallel_lmdz
    4       USE mod_filtreg_p
    5       IMPLICIT NONE
     1SUBROUTINE convmas1_loc (pbaru, pbarv, convm)
     2!
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute mass flux convergence at p levels.
     7!          Equivalent to convmas_loc if convmas2_loc is called after.
     8  USE parallel_lmdz
     9  USE mod_filtreg_p
     10  IMPLICIT NONE
     11  include "dimensions.h"
     12  include "paramet.h"
     13  include "comgeom.h"
     14  include "logic.h"
     15!===============================================================================
     16! Arguments:
     17  REAL, INTENT(IN)  :: pbaru(ijb_u:ije_u,llm)
     18  REAL, INTENT(IN)  :: pbarv(ijb_v:ije_v,llm)
     19  REAL, TARGET, INTENT(OUT) :: convm(ijb_u:ije_u,llm)
     20!===============================================================================
     21! Method used:   Computation from top to bottom.
     22!   Mass convergence at level llm is equal to zero and is not stored in convm.
     23!===============================================================================
     24! Local variables:
     25  INTEGER :: l, jjb, jje
     26!===============================================================================
    627
    7 c=======================================================================
    8 c
    9 c   Auteurs:  P. Le Van , F. Hourdin  .
    10 c   -------
    11 c
    12 c   Objet:
    13 c   ------
    14 c
    15 c   ********************************************************************
    16 c   .... calcul de la convergence du flux de masse aux niveaux p ...
    17 c   ********************************************************************
    18 c
    19 c
    20 c     pbaru  et  pbarv  sont des arguments d'entree pour le s-pg  ....
    21 c      .....  convm      est  un argument de sortie pour le s-pg  ....
    22 c
    23 c    le calcul se fait de haut en bas,
    24 c    la convergence de masse au niveau p(llm+1) est egale a 0. et
    25 c    n'est pas stockee dans le tableau convm .
    26 c
    27 c
    28 c=======================================================================
    29 c
    30 c   Declarations:
    31 c   -------------
     28!--- Computation of - (d(pbaru)/dx + d(pbarv)/dy )
     29  CALL convflu_loc( pbaru, pbarv, llm, convm )
    3230
    33 #include "dimensions.h"
    34 #include "paramet.h"
    35 #include "comvert.h"
    36 #include "logic.h"
     31!--- Filter
     32  jjb=jj_begin
     33  jje=jj_end+1
     34  IF(pole_sud) jje=jj_end
     35  CALL filtreg_p(convm,jjb_u,jje_u,jjb,jje,jjp1,llm,2,2,.TRUE.,1)
    3736
    38       REAL pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm )
    39       REAL, target :: convm(  ijb_u:ije_u,llm )
    40       INTEGER   l,ij
     37END SUBROUTINE convmas1_loc
    4138
    42       INTEGER ijb,ije,jjb,jje
    43  
    44      
    45 c-----------------------------------------------------------------------
    46 c    ....  calcul de - (d(pbaru)/dx + d(pbarv)/dy ) ......
    47 
    48       CALL  convflu_loc( pbaru, pbarv, llm, convm )
    49 
    50 c-----------------------------------------------------------------------
    51 c   filtrage:
    52 c   ---------
    53        
    54        jjb=jj_begin
    55        jje=jj_end+1
    56        if (pole_sud) jje=jj_end
    57  
    58        CALL filtreg_p( convm, jjb_u,jje_u,jjb, jje, jjp1, llm,
    59      &                 2, 2, .true., 1 )
    60 
    61 c    integration de la convergence de masse de haut  en bas ......
    62 c
    63       RETURN
    64       END
  • LMDZ5/trunk/libf/dyn3dmem/convmas2_loc.F90

    r2335 r2336  
    1       SUBROUTINE convmas2_loc ( convm )
    2 c
    3       USE parallel_lmdz
    4       IMPLICIT NONE
     1SUBROUTINE convmas2_loc (convm)
     2!
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute mass flux convergence at p levels.
     7!          Equivalent to convmas_loc if convmas1_loc is called before.
     8  USE parallel_lmdz
     9  IMPLICIT NONE
     10  include "dimensions.h"
     11  include "paramet.h"
     12  include "comgeom.h"
     13  include "logic.h"
     14!===============================================================================
     15! Arguments:
     16  REAL, INTENT(INOUT) :: convm(ijb_u:ije_u,llm)
     17!===============================================================================
     18! Method used:   Computation from top to bottom.
     19!   Mass convergence at level llm is equal to zero and is not stored in convm.
     20!===============================================================================
     21! Local variables:
     22  INTEGER :: l, ijb, ije
     23!===============================================================================
    524
    6 c=======================================================================
    7 c
    8 c   Auteurs:  P. Le Van , F. Hourdin  .
    9 c   -------
    10 c
    11 c   Objet:
    12 c   ------
    13 c
    14 c   ********************************************************************
    15 c   .... calcul de la convergence du flux de masse aux niveaux p ...
    16 c   ********************************************************************
    17 c
    18 c
    19 c     pbaru  et  pbarv  sont des arguments d'entree pour le s-pg  ....
    20 c      .....  convm      est  un argument de sortie pour le s-pg  ....
    21 c
    22 c    le calcul se fait de haut en bas,
    23 c    la convergence de masse au niveau p(llm+1) est egale a 0. et
    24 c    n'est pas stockee dans le tableau convm .
    25 c
    26 c
    27 c=======================================================================
    28 c
    29 c   Declarations:
    30 c   -------------
     25!$OMP MASTER
     26!--- Mass convergence is integrated from top to bottom
     27  ijb=ij_begin
     28  ije=ij_end+iip1
     29  IF(pole_sud) ije=ij_end
     30  DO l=llmm1,1,-1
     31    convm(ijb:ije,l) = convm(ijb:ije,l) + convm(ijb:ije,l+1)
     32  END DO
     33!$OMP END MASTER
    3134
    32 #include "dimensions.h"
    33 #include "paramet.h"
    34 #include "comvert.h"
    35 #include "logic.h"
     35END SUBROUTINE convmas2_loc
    3636
    37       REAL pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm )
    38       REAL :: convm(  ijb_u:ije_u,llm )
    39       INTEGER   l,ij
    40       INTEGER ijb,ije,jjb,jje
    41  
    42 c$OMP MASTER
    43 c    integration de la convergence de masse de haut  en bas ......
    44        ijb=ij_begin
    45        ije=ij_end+iip1
    46        if (pole_sud) ije=ij_end
    47            
    48       DO      l      = llmm1, 1, -1
    49         DO    ij     = ijb, ije
    50          convm(ij,l) = convm(ij,l) + convm(ij,l+1)
    51         ENDDO
    52       ENDDO
    53 c
    54 c$OMP END MASTER
    55       RETURN
    56       END
  • LMDZ5/trunk/libf/dyn3dmem/convmas_loc.F90

    r2335 r2336  
    1       SUBROUTINE convmas_loc (pbaru, pbarv, convm )
    2 c
    3       USE parallel_lmdz
    4       USE mod_filtreg_p
    5       IMPLICIT NONE
     1SUBROUTINE convmas_loc (pbaru, pbarv, convm)
     2!
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute mass flux convergence at p levels.
     7  USE parallel_lmdz
     8  USE mod_filtreg_p
     9  IMPLICIT NONE
     10  include "dimensions.h"
     11  include "paramet.h"
     12  include "comgeom.h"
     13  include "logic.h"
     14!===============================================================================
     15! Arguments:
     16  REAL, INTENT(IN)  :: pbaru(ijb_u:ije_u,llm)
     17  REAL, INTENT(IN)  :: pbarv(ijb_v:ije_v,llm)
     18  REAL, INTENT(OUT) :: convm(ijb_u:ije_u,llm)
     19!===============================================================================
     20! Method used:   Computation from top to bottom.
     21!   Mass convergence at level llm is equal to zero and is not stored in convm.
     22!===============================================================================
     23! Local variables:
     24  INTEGER :: l, ijb, ije, jjb, jje
     25!===============================================================================
    626
    7 c=======================================================================
    8 c
    9 c   Auteurs:  P. Le Van , F. Hourdin  .
    10 c   -------
    11 c
    12 c   Objet:
    13 c   ------
    14 c
    15 c   ********************************************************************
    16 c   .... calcul de la convergence du flux de masse aux niveaux p ...
    17 c   ********************************************************************
    18 c
    19 c
    20 c     pbaru  et  pbarv  sont des arguments d'entree pour le s-pg  ....
    21 c      .....  convm      est  un argument de sortie pour le s-pg  ....
    22 c
    23 c    le calcul se fait de haut en bas,
    24 c    la convergence de masse au niveau p(llm+1) est egale a 0. et
    25 c    n'est pas stockee dans le tableau convm .
    26 c
    27 c
    28 c=======================================================================
    29 c
    30 c   Declarations:
    31 c   -------------
     27!--- Computation of - (d(pbaru)/dx + d(pbarv)/dy )
     28  CALL convflu_loc( pbaru, pbarv, llm, convm )
    3229
    33 #include "dimensions.h"
    34 #include "paramet.h"
    35 #include "comvert.h"
    36 #include "logic.h"
     30!--- Filter
     31  jjb=jj_begin
     32  jje=jj_end+1
     33  IF(pole_sud) jje=jj_end
     34  CALL filtreg_p(convm,jjb_u,jje_u,jjb,jje,jjp1,llm,2,2,.TRUE.,1)
    3735
    38       REAL pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm )
    39       REAL, target :: convm(  ijb_u:ije_u,llm )
    40       INTEGER   l,ij
    41 
    42       INTEGER ijb,ije,jjb,jje
    43  
    44      
    45 c-----------------------------------------------------------------------
    46 c    ....  calcul de - (d(pbaru)/dx + d(pbarv)/dy ) ......
    47 
    48       CALL  convflu_loc( pbaru, pbarv, llm, convm )
    49 
    50 c-----------------------------------------------------------------------
    51 c   filtrage:
    52 c   ---------
    53        
    54        jjb=jj_begin
    55        jje=jj_end+1
    56        if (pole_sud) jje=jj_end
    57  
    58        CALL filtreg_p(convm, jjb_u, jje_u,jjb, jje, jjp1, llm,
    59      &                 2, 2, .true., 1 )
    60 
    61 c    integration de la convergence de masse de haut  en bas ......
     36!--- Mass convergence is integrated from top to bottom
    6237!$OMP BARRIER
    6338!$OMP MASTER
    64        ijb=ij_begin
    65        ije=ij_end+iip1
    66        if (pole_sud) ije=ij_end
    67            
    68       DO      l      = llmm1, 1, -1
    69         DO    ij     = ijb, ije
    70          convm(ij,l) = convm(ij,l) + convm(ij,l+1)
    71         ENDDO
    72       ENDDO
    73 c
     39  ijb=ij_begin
     40  ije=ij_end+iip1
     41  IF(pole_sud) ije=ij_end
     42  DO l=llmm1,1,-1
     43    convm(ijb:ije,l) = convm(ijb:ije,l) + convm(ijb:ije,l+1)
     44  END DO
    7445!$OMP END MASTER
    7546!$OMP BARRIER
    76       RETURN
    77       END
     47
     48END SUBROUTINE convmas_loc
     49
  • LMDZ5/trunk/libf/dyn3dmem/enercin_loc.F90

    r2335 r2336  
    1       SUBROUTINE enercin_loc ( vcov, ucov, vcont, ucont, ecin )
    2       USE parallel_lmdz
    3       IMPLICIT NONE
     1SUBROUTINE enercin_loc ( vcov, ucov, vcont, ucont, ecin )
     2!
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute kinetic energy at sigma levels.
     7  USE parallel_lmdz
     8  IMPLICIT NONE
     9  include "dimensions.h"
     10  include "paramet.h"
     11  include "comgeom.h"
     12!===============================================================================
     13! Arguments:
     14  REAL, INTENT(IN)  :: vcov    (ijb_v:ije_v,llm)
     15  REAL, INTENT(IN)  :: ucov    (ijb_u:ije_u,llm)
     16  REAL, INTENT(IN)  :: vcont   (ijb_v:ije_v,llm)
     17  REAL, INTENT(IN)  :: ucont   (ijb_u:ije_u,llm)
     18  REAL, INTENT(OUT) :: ecin    (ijb_u:ije_u,llm)
     19!===============================================================================
     20! Notes:
     21!                 . V
     22!                i,j-1
     23!
     24!      alpha4 .       . alpha1
     25!
     26!
     27!        U .      . P     . U
     28!       i-1,j    i,j      i,j
     29!
     30!      alpha3 .       . alpha2
     31!
     32!
     33!                 . V
     34!                i,j
     35!
     36! Kinetic energy at scalar point P(i,j) (excluding poles) is:
     37!       Ecin = 0.5 * U(i-1,j)**2 *( alpha3 + alpha4 )  +
     38!              0.5 * U(i  ,j)**2 *( alpha1 + alpha2 )  +
     39!              0.5 * V(i,j-1)**2 *( alpha1 + alpha4 )  +
     40!              0.5 * V(i,  j)**2 *( alpha2 + alpha3 )
     41!===============================================================================
     42! Local variables:
     43  INTEGER :: l, ij, i, ijb, ije
     44  REAL    :: ecinni(iim), ecinsi(iim), ecinpn, ecinps
     45!===============================================================================
     46!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     47  DO l=1,llm
    448
    5 c=======================================================================
    6 c
    7 c   Auteur: P. Le Van
    8 c   -------
    9 c
    10 c   Objet:
    11 c   ------
    12 c
    13 c *********************************************************************
    14 c .. calcul de l'energie cinetique aux niveaux s  ......
    15 c *********************************************************************
    16 c  vcov, vcont, ucov et ucont sont des arguments d'entree pour le s-pg .
    17 c  ecin         est  un  argument de sortie pour le s-pg
    18 c
    19 c=======================================================================
     49    ijb=ij_begin
     50    ije=ij_end+iip1
    2051
    21 #include "dimensions.h"
    22 #include "paramet.h"
    23 #include "comgeom.h"
     52    IF(pole_nord) ijb=ij_begin+iip1
     53    IF(pole_sud)  ije=ij_end-iip1
    2454
    25       REAL vcov( ijb_v:ije_v,llm ),vcont( ijb_v:ije_v,llm )
    26       REAL ucov( ijb_u:ije_u,llm ),ucont( ijb_u:ije_u,llm )
    27       REAL ecin( ijb_u:ije_u,llm )
     55    DO ij = ijb,ije-1
     56      ecin(ij+1,l)=0.5*(ucov(ij    ,l)*ucont(ij    ,l)*alpha3p4(ij +1)          &
     57                      + ucov(ij+1  ,l)*ucont(ij+1  ,l)*alpha1p2(ij +1)          &
     58                      + vcov(ij-iim,l)*vcont(ij-iim,l)*alpha1p4(ij +1)          &
     59                      + vcov(ij+1  ,l)*vcont(ij+1  ,l)*alpha2p3(ij +1) )
     60    END DO
    2861
    29       REAL ecinni( iip1 ),ecinsi( iip1 )
     62    !--- Correction: ecin(1,j,l)= ecin(iip1,j,l)
     63    DO ij=ijb,ije,iip1; ecin(ij,l) = ecin(ij+iim,l); END DO
    3064
    31       REAL ecinpn, ecinps
    32       INTEGER     l,ij,i,ijb,ije
     65    !--- North pole
     66    IF(pole_nord) THEN
     67      ecinni(:) = vcov(1:iim,l)*vcont(1:iim,l)*aire(1:iim)
     68      ecinpn = 0.5*SUM(ecinni)/apoln
     69      ecin(1:iip1,l)=ecinpn
     70    END IF
    3371
    34       EXTERNAL    SSUM
    35       REAL        SSUM
     72    !--- South pole
     73    IF(pole_sud) THEN
     74      DO i=1,iim
     75        ecinsi(i) = vcov(i+ip1jmi1,l)*vcont(i+ip1jmi1,l)*aire(i+ip1jm)
     76      END DO
     77      ecinps = 0.5*SUM(ecinsi)/apols
     78      ecin(1+ip1jm:ip1jmp1,l)=ecinps
     79    END IF
     80  END DO
     81!$OMP END DO NOWAIT
    3682
     83END SUBROUTINE enercin_loc
    3784
    38 
    39 c                 . V
    40 c                i,j-1
    41 
    42 c      alpha4 .       . alpha1
    43 
    44 
    45 c        U .      . P     . U
    46 c       i-1,j    i,j      i,j
    47 
    48 c      alpha3 .       . alpha2
    49 
    50 
    51 c                 . V
    52 c                i,j
    53 
    54 c   
    55 c  L'energie cinetique au point scalaire P(i,j) ,autre que les poles, est :
    56 c       Ecin = 0.5 * U(i-1,j)**2 *( alpha3 + alpha4 )  +
    57 c              0.5 * U(i  ,j)**2 *( alpha1 + alpha2 )  +
    58 c              0.5 * V(i,j-1)**2 *( alpha1 + alpha4 )  +
    59 c              0.5 * V(i,  j)**2 *( alpha2 + alpha3 )
    60 
    61 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    62       DO 5 l = 1,llm
    63      
    64       ijb=ij_begin
    65       ije=ij_end+iip1
    66      
    67       IF (pole_nord) ijb=ij_begin+iip1
    68       IF (pole_sud)  ije=ij_end-iip1
    69      
    70       DO 1  ij = ijb, ije -1
    71       ecin( ij+1, l )  =    0.5  *
    72      * (   ucov( ij   ,l ) * ucont( ij   ,l ) * alpha3p4( ij +1 )   +
    73      *     ucov( ij+1 ,l ) * ucont( ij+1 ,l ) * alpha1p2( ij +1 )   +
    74      *     vcov(ij-iim,l ) * vcont(ij-iim,l ) * alpha1p4( ij +1 )   +
    75      *     vcov( ij+ 1,l ) * vcont( ij+ 1,l ) * alpha2p3( ij +1 )   )
    76    1  CONTINUE
    77 
    78 c    ... correction pour  ecin(1,j,l)  ....
    79 c    ...   ecin(1,j,l)= ecin(iip1,j,l) ...
    80 
    81 CDIR$ IVDEP
    82       DO 2 ij = ijb, ije, iip1
    83       ecin( ij,l ) = ecin( ij + iim, l )
    84    2  CONTINUE
    85 
    86 c     calcul aux poles  .......
    87 
    88       IF (pole_nord) THEN
    89    
    90         DO  i = 1, iim
    91          ecinni(i) = vcov(    i  ,  l) *
    92      *               vcont(    i    ,l) * aire(   i   )
    93         ENDDO
    94 
    95         ecinpn = 0.5 * SSUM( iim,ecinni,1 ) / apoln
    96 
    97         DO ij = 1,iip1
    98           ecin(   ij     , l ) = ecinpn
    99         ENDDO
    100    
    101       ENDIF
    102 
    103       IF (pole_sud) THEN
    104    
    105         DO  i = 1, iim
    106          ecinsi(i) = vcov(i+ip1jmi1,l)*
    107      *               vcont(i+ip1jmi1,l) * aire(i+ip1jm)
    108         ENDDO
    109 
    110         ecinps = 0.5 * SSUM( iim,ecinsi,1 ) / apols
    111 
    112         DO ij = 1,iip1
    113           ecin( ij+ ip1jm, l ) = ecinps
    114         ENDDO
    115    
    116       ENDIF
    117 
    118      
    119    5  CONTINUE
    120 c$OMP END DO NOWAIT
    121       RETURN
    122       END
  • LMDZ5/trunk/libf/dyn3dmem/flumass_loc.F90

    r2335 r2336  
    1       SUBROUTINE flumass_loc(massebx,masseby,vcont,ucont,pbaru,pbarv)
    2       USE parallel_lmdz
    3       IMPLICIT NONE
     1SUBROUTINE flumass_loc(massebx,masseby, vcont, ucont, pbaru, pbarv )
     2!
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute mass flux at s levels.
     7  USE parallel_lmdz
     8  IMPLICIT NONE
     9  include "dimensions.h"
     10  include "paramet.h"
     11  include "comgeom.h"
     12!===============================================================================
     13! Arguments:
     14  REAL, INTENT(IN)  :: massebx(ijb_u:ije_u,llm)
     15  REAL, INTENT(IN)  :: masseby(ijb_v:ije_v,llm)
     16  REAL, INTENT(IN)  :: vcont  (ijb_v:ije_v,llm)
     17  REAL, INTENT(IN)  :: ucont  (ijb_u:ije_u,llm)
     18  REAL, INTENT(OUT) :: pbaru  (ijb_u:ije_u,llm)
     19  REAL, INTENT(OUT) :: pbarv  (ijb_v:ije_v,llm)
     20!===============================================================================
     21! Method used:   A 2 equations system is solved.
     22!   * 1st one describes divergence computation at pole point nr. i (i=1 to im):
     23!     (0.5*(pbaru(i)-pbaru(i-1))-pbarv(i))/aire(i) = - SUM(pbarv(n))/aire pole
     24!   * 2nd one specifies that mean mass flux at pole is equal to 0:
     25!     SUM(pbaru(n)*local_area(n))=0
     26! This way, we determine additive constant common to pbary elements representing
     27!   pbaru(0,j,l) in divergence computation equation for point i=1. (i=1 to im)
     28!===============================================================================
     29! Local variables:
     30  REAL    :: sairen, saireun, ctn, ctn0, apbarun(iim)
     31  REAL    :: saires, saireus, cts, cts0, apbarus(iim)
     32  INTEGER :: l, i, ij, ijb, ije
     33!===============================================================================
     34!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     35  DO l=1,llm
    436
    5 c=======================================================================
    6 c
    7 c   Auteurs:  P. Le Van, F. Hourdin  .
    8 c   -------
    9 c
    10 c   Objet:
    11 c   ------
    12 c
    13 c *********************************************************************
    14 c     .... calcul du flux de masse  aux niveaux s ......
    15 c *********************************************************************
    16 c   massebx,masseby,vcont et ucont sont des argum. d'entree pour le s-pg .
    17 c       pbaru  et pbarv            sont des argum.de sortie pour le s-pg .
    18 c
    19 c=======================================================================
     37    ijb=ij_begin
     38    ije=ij_end+iip1
     39    IF(pole_nord) ijb=ij_begin+iip1
     40    IF(pole_sud)  ije=ij_end-iip1
     41    pbaru(ijb:ije,l)=massebx(ijb:ije,l)*ucont(ijb:ije,l)
    2042
     43    ijb=ij_begin-iip1
     44    ije=ij_end+iip1
     45    IF(pole_nord) ijb=ij_begin
     46    IF(pole_sud)  ije=ij_end-iip1
     47    pbarv(ijb:ije,l)=masseby(ijb:ije,l)*vcont(ijb:ije,l)
    2148
    22 #include "dimensions.h"
    23 #include "paramet.h"
    24 #include "comgeom.h"
     49  END DO
     50!$OMP END DO NOWAIT
    2551
    26       REAL massebx( ijb_u:ije_u,llm ),masseby( ijb_v:ije_v,llm ) ,
    27      * vcont( ijb_v:ije_v,llm ),ucont( ijb_u:ije_u,llm ),
    28      * pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm )
     52  !--- North pole
     53  IF(pole_nord) THEN
     54    sairen =SUM(aire (1:iim))
     55    saireun=SUM(aireu(1:iim))
     56!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     57    DO l=1,llm
     58      ctn=SUM(pbarv(1:iim,l))/sairen
     59      pbaru(1,l)= pbarv(1,l)-ctn*aire(1)
     60      DO i=2,iim
     61        pbaru(i,l)=pbaru(i-1,l)+pbarv(i,l)-ctn*aire(i)
     62      END DO
     63      apbarun(:)=aireu(1:iim)*pbaru(1:iim,l)
     64      ctn0 = -SUM(apbarun)/saireun
     65      pbaru(1:iim,l)=2.*(pbaru(1:iim,l)+ctn0)
     66      pbaru(iip1,l)=pbaru(1,l)
     67    END DO
     68!$OMP END DO NOWAIT             
     69  END IF
    2970
    30       REAL apbarun( iip1 ),apbarus( iip1 )
     71  !--- South pole
     72  IF(pole_sud) THEN
     73    saires =SUM(aire (ip1jm+1:ip1jmp1-1))
     74    saireus=SUM(aireu(ip1jm+1:ip1jmp1-1))
     75!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     76    DO l=1,llm
     77      cts=SUM(pbarv(1+ip1jmi1:ip1jm-1,l))/saires
     78      pbaru(1+ip1jm,l)=-pbarv(1+ip1jmi1,l)+cts*aire(1+ip1jm)
     79      DO i=2,iim
     80        pbaru(i+ip1jm,l)=pbaru(i-1+ip1jm,l)-pbarv(i+ip1jmi1,l)+cts*aire(i+ip1jm)
     81      END DO
     82      apbarus(:)=aireu(1+ip1jm:ip1jmp1-1)*pbaru(1+ip1jm:ip1jmp1-1,l)
     83      cts0 = -SUM(apbarus)/saireus
     84      pbaru(1+ip1jm:ip1jmp1-1,l)=2.*(pbaru(1+ip1jm:ip1jmp1-1,l)+cts0)
     85      pbaru(ip1jmp1,l)=pbaru(1+ip1jm,l)
     86    END DO
     87!$OMP END DO NOWAIT         
     88  END IF
    3189
    32       REAL sairen,saireun,saires,saireus,ctn,cts,ctn0,cts0
    33       INTEGER  l,ij,i
    34       INTEGER ijb,ije
    35      
    36       EXTERNAL   SSUM
    37       REAL       SSUM
    38      
    39 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
    40       DO  5 l = 1,llm
     90END SUBROUTINE flumass_loc
    4191
    42         ijb=ij_begin
    43         ije=ij_end+iip1
    44      
    45         if (pole_nord) ijb=ij_begin+iip1
    46         if (pole_sud)  ije=ij_end-iip1
    47        
    48         DO  1 ij = ijb,ije
    49           pbaru( ij,l ) = massebx( ij,l ) * ucont( ij,l )
    50    1    CONTINUE
    51 
    52         ijb=ij_begin-iip1
    53         ije=ij_end+iip1
    54      
    55         if (pole_nord) ijb=ij_begin
    56         if (pole_sud)  ije=ij_end-iip1
    57        
    58         DO 3 ij = ijb,ije
    59           pbarv( ij,l ) = masseby( ij,l ) * vcont( ij,l )
    60    3    CONTINUE
    61 
    62    5  CONTINUE
    63 c$OMP END DO NOWAIT
    64 c    ................................................................
    65 c     calcul de la composante du flux de masse en x aux poles .......
    66 c    ................................................................
    67 c     par la resolution d'1 systeme de 2 equations .
    68 
    69 c     la premiere equat.decrivant le calcul de la divergence en 1 point i
    70 c     du pole,ce calcul etant itere de i=1 a i=im .
    71 c                 c.a.d   ,
    72 c     ( ( 0.5*pbaru(i)-0.5*pbaru(i-1) - pbarv(i))/aire(i)   =
    73 c                                           - somme de ( pbarv(n) )/aire pole
    74 
    75 c     l'autre equat.specifiant que la moyenne du flux de masse au pole est =0.
    76 c     c.a.d    somme de pbaru(n)*aire locale(n) = 0.
    77 
    78 c     on en revient ainsi a determiner la constante additive commune aux pbaru
    79 c     qui representait pbaru(0,j,l) dans l'equat.du calcul de la diverg.au pt
    80 c     i=1 .
    81 c     i variant de 1 a im
    82 c     n variant de 1 a im
    83 
    84       IF (pole_nord) THEN
    85      
    86         sairen = SSUM( iim,  aire(   1     ), 1 )
    87         saireun= SSUM( iim, aireu(   1     ), 1 )
    88 
    89 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
    90         DO l = 1,llm
    91  
    92           ctn =  SSUM( iim, pbarv(    1     ,l),  1 )/ sairen
    93      
    94           pbaru(1,l)=pbarv(1,l) - ctn * aire(1)
    95        
    96           DO i = 2,iim
    97             pbaru(i,l) = pbaru(i- 1,l )    +
    98      *                   pbarv(i,l) - ctn * aire(i )
    99           ENDDO
    100        
    101           DO i = 1,iim
    102             apbarun(i) = aireu(    i   ) * pbaru(   i    , l)
    103           ENDDO
    104      
    105           ctn0 = -SSUM( iim,apbarun,1 )/saireun
    106        
    107           DO i = 1,iim
    108             pbaru(   i    , l) = 2. * ( pbaru(   i    , l) + ctn0 )
    109           ENDDO
    110        
    111           pbaru(   iip1 ,l ) = pbaru(    1    ,l )
    112        
    113         ENDDO
    114 c$OMP END DO NOWAIT             
    115 
    116       ENDIF
    117 
    118      
    119       IF (pole_sud) THEN
    120  
    121         saires = SSUM( iim,  aire( ip1jm+1 ), 1 )
    122         saireus= SSUM( iim, aireu( ip1jm+1 ), 1 )
    123 
    124 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
    125         DO  l = 1,llm
    126  
    127           cts =  SSUM( iim, pbarv(ip1jmi1+ 1,l),  1 )/ saires
    128           pbaru(ip1jm+1,l)= - pbarv(ip1jmi1+1,l) + cts * aire(ip1jm+1)
    129    
    130           DO i = 2,iim
    131             pbaru(i+ ip1jm,l) = pbaru(i+ip1jm-1,l)    -
    132      *                          pbarv(i+ip1jmi1,l)+cts*aire(i+ip1jm)
    133           ENDDO
    134        
    135           DO i = 1,iim
    136             apbarus(i) = aireu(i +ip1jm) * pbaru(i +ip1jm, l)
    137           ENDDO
    138 
    139           cts0 = -SSUM( iim,apbarus,1 )/saireus
    140 
    141           DO i = 1,iim
    142             pbaru(i+ ip1jm, l) = 2. * ( pbaru(i +ip1jm, l) + cts0 )
    143           ENDDO
    144 
    145           pbaru( ip1jmp1,l ) = pbaru( ip1jm +1,l )
    146        
    147         ENDDO
    148 c$OMP END DO NOWAIT         
    149       ENDIF
    150      
    151       RETURN
    152       END
  • LMDZ5/trunk/libf/dyn3dmem/massbar_loc.F90

    r2335 r2336  
    1       SUBROUTINE massbar_loc(  masse, massebx, masseby )
    2      
    3 c
    4 c **********************************************************************
    5 c
    6 c  Calcule les moyennes en x et  y de la masse d'air dans chaque maille.
    7 c **********************************************************************
    8 c    Auteurs : P. Le Van , Fr. Hourdin  .
    9 c   ..........
    10 c
    11 c  ..  masse                 est  un argum. d'entree  pour le s-pg ...
    12 c  ..  massebx,masseby      sont des argum. de sortie pour le s-pg ...
    13 c     
    14 c
    15       USE parallel_lmdz
    16       IMPLICIT NONE
    17 c
    18 #include "dimensions.h"
    19 #include "paramet.h"
    20 #include "comconst.h"
    21 #include "comgeom.h"
    22 c
    23       REAL    masse( ijb_u:ije_u,llm ), massebx( ijb_u:ije_u,llm )  ,
    24      *      masseby(   ijb_v:ije_v,llm )
    25       INTEGER ij,l,ijb,ije
    26 c
    27 c
    28 c   Methode pour calculer massebx et masseby .
    29 c   ----------------------------------------
    30 c
    31 c    A chaque point scalaire P (i,j) est affecte 4 coefficients d'aires
    32 c       alpha1(i,j)  calcule  au point ( i+1/4,j-1/4 )
    33 c       alpha2(i,j)  calcule  au point ( i+1/4,j+1/4 )
    34 c       alpha3(i,j)  calcule  au point ( i-1/4,j+1/4 )
    35 c       alpha4(i,j)  calcule  au point ( i-1/4,j-1/4 )
    36 c
    37 c    Avec  alpha1(i,j) = aire(i+1/4,j-1/4)/ aire(i,j)       
    38 c
    39 c    N.B .  Pour plus de details, voir s-pg  ...  iniconst ...
    40 c
    41 c
    42 c
    43 c   alpha4 .         . alpha1    . alpha4
    44 c    (i,j)             (i,j)       (i+1,j)
    45 c
    46 c             P .        U .          . P
    47 c           (i,j)       (i,j)         (i+1,j)
    48 c
    49 c   alpha3 .         . alpha2    .alpha3
    50 c    (i,j)              (i,j)     (i+1,j)
    51 c
    52 c             V .        Z .          . V
    53 c           (i,j)
    54 c
    55 c   alpha4 .         . alpha1    .alpha4
    56 c   (i,j+1)            (i,j+1)   (i+1,j+1)
    57 c
    58 c             P .        U .          . P
    59 c          (i,j+1)                    (i+1,j+1)
    60 c
    61 c
    62 c
    63 c                       On  a :
    64 c
    65 c    massebx(i,j) = masse(i  ,j) * ( alpha1(i  ,j) + alpha2(i,j))   +
    66 c                   masse(i+1,j) * ( alpha3(i+1,j) + alpha4(i+1,j) )
    67 c     localise  au point  ... U (i,j) ...
    68 c
    69 c    masseby(i,j) = masse(i,j  ) * ( alpha2(i,j  ) + alpha3(i,j  )  +
    70 c                   masse(i,j+1) * ( alpha1(i,j+1) + alpha4(i,j+1) 
    71 c     localise  au point  ... V (i,j) ...
    72 c
    73 c
    74 c=======================================================================
    75      
    76      
    77      
    78 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
    79       DO   100    l = 1 , llm
    80 c
    81         ijb=ij_begin
    82         ije=ij_end+iip1
    83         if (pole_sud) ije=ije-iip1
    84        
    85         DO  ij = ijb, ije - 1
    86          massebx(ij,l) =  masse( ij, l) * alpha1p2( ij  )     +
    87      *                   masse(ij+1, l) * alpha3p4(ij+1 )
    88         ENDDO
     1SUBROUTINE massbar_loc(masse,massebx,masseby)
     2!
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute air mass mean along X and Y in each cell.
     7! See iniconst for more details.
     8  USE parallel_lmdz
     9  IMPLICIT NONE
     10  include "dimensions.h"
     11  include "paramet.h"
     12  include "comgeom.h"
     13!===============================================================================
     14! Arguments:
     15  REAL, INTENT(IN)  :: masse  (ijb_u:ije_u,llm)
     16  REAL, INTENT(OUT) :: massebx(ijb_u:ije_u,llm)
     17  REAL, INTENT(OUT) :: masseby(ijb_v:ije_v,llm)
     18!-------------------------------------------------------------------------------
     19! Method used. Each scalar point is associated to 4 area coefficients:
     20!    * alpha1(i,j) at point ( i+1/4,j-1/4 )
     21!    * alpha2(i,j) at point ( i+1/4,j+1/4 )
     22!    * alpha3(i,j) at point ( i-1/4,j+1/4 )
     23!    * alpha4(i,j) at point ( i-1/4,j-1/4 )
     24! where alpha1(i,j) = aire(i+1/4,j-1/4)/ aire(i,j)
     25!
     26!   alpha4 .         . alpha1    . alpha4
     27!    (i,j)             (i,j)       (i+1,j)
     28!
     29!             P .        U .          . P
     30!           (i,j)       (i,j)         (i+1,j)
     31!
     32!   alpha3 .         . alpha2    .alpha3
     33!    (i,j)              (i,j)     (i+1,j)
     34!
     35!             V .        Z .          . V
     36!           (i,j)
     37!
     38!   alpha4 .         . alpha1    .alpha4
     39!   (i,j+1)            (i,j+1)   (i+1,j+1)
     40!
     41!             P .        U .          . P
     42!          (i,j+1)                    (i+1,j+1)
     43!
     44!
     45!    massebx(i,j) = masse(i  ,j) * ( alpha1(i  ,j) + alpha2(i,j))   +
     46!                   masse(i+1,j) * ( alpha3(i+1,j) + alpha4(i+1,j) )
     47!     localized at point  ... U (i,j) ...
     48!
     49!    masseby(i,j) = masse(i,j  ) * ( alpha2(i,j  ) + alpha3(i,j  )  +
     50!                   masse(i,j+1) * ( alpha1(i,j+1) + alpha4(i,j+1) 
     51!     localized at point  ... V (i,j) ...
     52!===============================================================================
     53! Local variables:
     54  INTEGER :: ij, l, ijb, ije
     55!===============================================================================
     56!$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
     57  DO l=1,llm
     58    ijb=ij_begin
     59    ije=ij_end+iip1
     60    IF(pole_sud) ije=ije-iip1
     61    DO ij=ijb,ije-1
     62      massebx(ij,l)=masse(ij,l)*alpha1p2(ij)+masse(ij+1   ,l)*alpha3p4(ij+1)
     63    END DO
     64    DO ij=ijb+iim,ije+iim,iip1; massebx(ij,l)=massebx(ij-iim,l); END DO
     65    ijb=ij_begin-iip1
     66    ije=ij_end+iip1
     67    IF(pole_nord) ijb=ij_begin
     68    IF(pole_sud) ije=ij_end-iip1
     69    DO ij=ijb,ije
     70      masseby(ij,l)=masse(ij,l)*alpha2p3(ij)+masse(ij+iip1,l)*alpha1p4(ij+iip1)
     71    END DO
     72  END DO
     73!$OMP END DO NOWAIT
    8974
    90 c    .... correction pour massebx( iip1,j) .....
    91 c    ...    massebx(iip1,j)= massebx(1,j) ...
    92 c
    93 CDIR$ IVDEP
     75END SUBROUTINE massbar_loc
    9476
    95        
    96 
    97         DO  ij = ijb+iim, ije+iim, iip1
    98          massebx( ij,l ) = massebx( ij - iim,l )
    99         ENDDO
    100 
    101 
    102      
    103         ijb=ij_begin-iip1
    104         ije=ij_end+iip1
    105         if (pole_nord) ijb=ij_begin
    106         if (pole_sud) ije=ij_end-iip1
    107 
    108          DO  ij = ijb,ije
    109          masseby( ij,l ) = masse(  ij   , l ) * alpha2p3(   ij    )  +
    110      *                     masse(ij+iip1, l ) * alpha1p4( ij+iip1 )
    111          ENDDO
    112 
    113 100   CONTINUE
    114 c$OMP END DO NOWAIT
    115 c
    116       RETURN
    117       END
  • LMDZ5/trunk/libf/dyn3dmem/massbarxy_loc.F90

    r2335 r2336  
    1       SUBROUTINE massbarxy_loc(  masse, massebxy )
    2       USE parallel_lmdz
    3       implicit none
    4 c **********************************************************************
    5 c
    6 c  Calcule les moyennes en x et  y de la masse d'air dans chaque maille.
    7 c **********************************************************************
    8 c    Auteurs : P. Le Van , Fr. Hourdin  .
    9 c   ..........
    10 c
    11 c  ..  masse          est  un  argum. d'entree  pour le s-pg ...
    12 c  ..  massebxy       est  un  argum. de sortie pour le s-pg ...
    13 c     
    14 c
    15 c     IMPLICIT NONE
    16 c
    17 #include "dimensions.h"
    18 #include "paramet.h"
    19 #include "comconst.h"
    20 #include "comgeom.h"
    21 c
    22        REAL  masse( ijb_u:ije_u,llm ), massebxy( ijb_v:ije_v,llm )
    23 c
    24       INTEGER ij,l,ijb,ije
     1SUBROUTINE massbarxy_loc(masse,massebxy)
     2!
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute air mass mean along X and Y in each cell.
     7! See iniconst for more details.
     8  USE parallel_lmdz
     9  IMPLICIT NONE
     10  include "dimensions.h"
     11  include "paramet.h"
     12  include "comconst.h"
     13  include "comgeom.h"
     14!===============================================================================
     15! Arguments:
     16  REAL, INTENT(IN)  :: masse   (ijb_u:ije_u,llm)
     17  REAL, INTENT(OUT) :: massebxy(ijb_v:ije_v,llm)
     18!===============================================================================
     19! Local variables:
     20  INTEGER :: ij, l, ijb, ije
     21!===============================================================================
     22  ijb=ij_begin-iip1
     23  ije=ij_end
     24  IF(pole_nord) ijb=ijb+iip1
     25  IF(pole_sud)  ije=ije-iip1
     26!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
     27  DO l=1,llm
     28    DO ij=ijb,ije-1
     29      massebxy(ij,l)=masse(ij     ,l)*alpha2(ij     ) + &
     30     +               masse(ij+1   ,l)*alpha3(ij+1   ) + &
     31     +               masse(ij+iip1,l)*alpha1(ij+iip1) + &
     32     +               masse(ij+iip2,l)*alpha4(ij+iip2)
     33    END DO
     34    DO ij=ijb+iip1-1,ije+iip1-1,iip1; massebxy(ij,l)=massebxy(ij-iim,l); END DO
     35  END DO
     36!$OMP END DO NOWAIT
    2537
    26      
    27       ijb=ij_begin-iip1
    28       ije=ij_end
    29      
    30       if (pole_nord) ijb=ijb+iip1
    31       if (pole_sud)  ije=ije-iip1
     38END SUBROUTINE massbarxy_loc
    3239
    33 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
    34       DO   100    l = 1 , llm
    35 c
    36       DO 5 ij = ijb, ije - 1
    37       massebxy( ij,l ) = masse(    ij  ,l ) * alpha2(   ij    )   +
    38      +                   masse(   ij+1 ,l ) * alpha3(  ij+1   )   +
    39      +                   masse( ij+iip1,l ) * alpha1( ij+iip1 )   +
    40      +                   masse( ij+iip2,l ) * alpha4( ij+iip2 )
    41    5  CONTINUE
    42 
    43 c    ....  correction pour     massebxy( iip1,j )  ........
    44 
    45 CDIR$ IVDEP
    46 
    47       DO 7 ij = ijb+iip1-1, ije+iip1-1, iip1
    48       massebxy( ij,l ) = massebxy( ij - iim,l )
    49    7  CONTINUE
    50 
    51 100   CONTINUE
    52 c$OMP END DO NOWAIT
    53 c
    54       RETURN
    55       END
  • LMDZ5/trunk/libf/dyn3dmem/tourpot_loc.F90

    r2335 r2336  
    1       SUBROUTINE tourpot_loc ( vcov, ucov, massebxy, vorpot )
    2       USE parallel_lmdz
    3       USE mod_filtreg_p
    4       IMPLICIT NONE
     1SUBROUTINE tourpot_loc ( vcov, ucov, massebxy, vorpot )
     2!
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute potential vorticity.
     7  USE parallel_lmdz
     8  USE mod_filtreg_p
     9  IMPLICIT NONE
     10  include "dimensions.h"
     11  include "paramet.h"
     12  include "comgeom.h"
     13  include "logic.h"
     14!===============================================================================
     15! Arguments:
     16  REAL, INTENT(IN)  :: vcov    (ijb_v:ije_v,llm)
     17  REAL, INTENT(IN)  :: ucov    (ijb_u:ije_u,llm)
     18  REAL, INTENT(IN)  :: massebxy(ijb_v:ije_v,llm)
     19  REAL, INTENT(OUT) :: vorpot  (ijb_v:ije_v,llm)
     20!===============================================================================
     21! Method used:
     22!   vorpot = ( Filtre( d(vcov)/dx - d(ucov)/dy ) + fext ) /psbarxy
     23!===============================================================================
     24! Local variables:
     25  INTEGER :: l, ij, ije, ijb, jje, jjb
     26  REAL    :: rot(ijb_v:ije_v,llm)
     27!===============================================================================
    528
    6 c=======================================================================
    7 c
    8 c   Auteur:  P. Le Van
    9 c   -------
    10 c
    11 c   Objet:
    12 c   ------
    13 c
    14 c    *******************************************************************
    15 c    .........      calcul du tourbillon potentiel             .........
    16 c    *******************************************************************
    17 c
    18 c     vcov,ucov,fext et pbarxyfl sont des argum. d'entree pour le s-pg .
    19 c             vorpot            est  un argum.de sortie pour le s-pg .
    20 c
    21 c=======================================================================
     29  ijb=ij_begin-iip1
     30  ije=ij_end
     31  IF(pole_nord) ijb=ij_begin
    2232
    23 #include "dimensions.h"
    24 #include "paramet.h"
    25 #include "comgeom.h"
    26 #include "logic.h"
     33!--- Wind vorticity ; correction: rot(iip1,j,l) = rot(1,j,l)
     34!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     35  DO l=1,llm
     36    IF(pole_sud) ije=ij_end-iip1-1
     37    DO ij=ijb,ije
     38      rot(ij,l)=vcov(ij+1,l)-vcov(ij,l)+ucov(ij+iip1,l)-ucov(ij,l)
     39    END DO
     40    IF(pole_sud) ije=ij_end-iip1
     41    DO ij=ijb+iip1-1,ije,iip1; rot(ij,l)=rot(ij-iim,l); END DO
     42  END DO
     43!$OMP END DO NOWAIT
    2744
    28       REAL  rot( ijb_v:ije_v,llm )
    29       REAL vcov( ijb_v:ije_v,llm ),ucov( ijb_u:ije_u,llm )
    30       REAL massebxy( ijb_v:ije_v,llm ),vorpot( ijb_v:ije_v,llm )
     45!--- Filter
     46  jjb=jj_begin-1
     47  jje=jj_end
     48  IF(pole_nord) jjb=jjb+1
     49  IF(pole_sud)  jje=jje-1
     50  CALL filtreg_p(rot,jjb_v,jje_v,jjb,jje,jjm,llm,2,1,.FALSE.,1)
    3151
    32       INTEGER l, ij ,ije,ijb,jje,jjb
     52!--- Potential vorticity ; correction: rot(iip1,j,l) = rot(1,j,l)
     53!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
     54  DO l=1,llm
     55    IF(pole_sud) ije=ij_end-iip1-1
     56    DO ij=ijb,ije
     57      vorpot(ij,l)=(rot(ij,l)+fext(ij))/massebxy(ij,l)
     58    END DO
     59    IF(pole_sud) ije=ij_end-iip1
     60    DO ij=ijb+iip1-1,ije,iip1; vorpot(ij,l)=vorpot(ij-iim,l); END DO
     61  END DO
     62!$OMP END DO NOWAIT
    3363
     64END SUBROUTINE tourpot_loc
    3465
    35       ijb=ij_begin-iip1
    36       ije=ij_end
    37      
    38       if (pole_nord) ijb=ij_begin
    39      
    40      
    41 c  ... vorpot = ( Filtre( d(vcov)/dx - d(ucov)/dy ) + fext ) /psbarxy ..
    42 
    43 
    44 
    45 c    ........  Calcul du rotationnel du vent V  puis filtrage  ........
    46 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
    47       DO 5 l = 1,llm
    48 
    49       if (pole_sud)  ije=ij_end-iip1-1
    50       DO 2 ij = ijb, ije
    51       rot( ij,l ) = vcov(ij+1,l)-vcov(ij,l)+ucov(ij+iip1,l)-ucov(ij,l)
    52    2  CONTINUE
    53 
    54 c    ....  correction pour  rot( iip1,j,l )  .....
    55 c    ....     rot(iip1,j,l) = rot(1,j,l)    .....
    56 
    57 CDIR$ IVDEP
    58 
    59       if (pole_sud)  ije=ij_end-iip1
    60      
    61       DO 3 ij = ijb+iip1-1, ije, iip1
    62       rot( ij,l ) = rot( ij -iim, l )
    63    3  CONTINUE
    64 
    65    5  CONTINUE
    66 c$OMP END DO NOWAIT
    67       jjb=jj_begin-1
    68       jje=jj_end
    69      
    70       if (pole_nord) jjb=jjb+1
    71       if (pole_sud)  jje=jje-1
    72       CALL  filtreg_p( rot, jjb_v,jje_v,jjb,jje,jjm, llm,
    73      &                 2, 1, .FALSE., 1 )
    74 
    75 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
    76       DO 10 l = 1, llm
    77      
    78       if (pole_sud)  ije=ij_end-iip1-1 
    79      
    80       DO 6 ij = ijb, ije
    81       vorpot( ij,l ) = ( rot(ij,l) + fext(ij) ) / massebxy(ij,l)
    82    6  CONTINUE
    83 
    84 c    ..... correction pour  vorpot( iip1,j,l)  .....
    85 c    ....   vorpot(iip1,j,l)= vorpot(1,j,l) ....
    86 CDIR$ IVDEP
    87       if (pole_sud)  ije=ij_end-iip1
    88       DO 8 ij = ijb+iip1-1, ije, iip1
    89       vorpot( ij,l ) = vorpot( ij -iim,l )
    90    8  CONTINUE
    91 
    92   10  CONTINUE
    93 c$OMP END DO NOWAIT
    94       RETURN
    95       END
  • LMDZ5/trunk/libf/dyn3dmem/vitvert_loc.F90

    r2335 r2336  
    1       SUBROUTINE vitvert_loc ( convm , w )
    2 c
    3       USE parallel_lmdz
    4       IMPLICIT NONE
     1SUBROUTINE vitvert_loc(convm, w)
     2!
     3!-------------------------------------------------------------------------------
     4! Authors: P. Le Van , Fr. Hourdin.
     5!-------------------------------------------------------------------------------
     6! Purpose: Compute vertical speed at sigma levels.
     7  USE parallel_lmdz
     8  IMPLICIT NONE
     9  include "dimensions.h"
     10  include "paramet.h"
     11  include "comvert.h"
     12!===============================================================================
     13! Arguments:
     14  REAL, INTENT(IN)  :: convm(ijb_u:ije_u,llm)
     15  REAL, INTENT(OUT) :: w    (ijb_u:ije_u,llm)
     16!===============================================================================
     17! Notes: Vertical speed is oriented from bottom to top.
     18!   * At ground - level sigma(1):     w(i,j,1) = 0.
     19!   * At top    - level sigma(llm+1): w(i,j,l) = 0. (not stored in w)
     20!===============================================================================
     21! Local variables:
     22  INTEGER :: l, ijb, ije
     23!===============================================================================
     24  ijb=ij_begin
     25  ije=ij_end+iip1
     26  IF(pole_sud) ije=ij_end
     27!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
     28  DO l=1,llmm1
     29    w(ijb:ije,l+1)=convm(ijb:ije,l+1)-bp(l+1)*convm(ijb:ije,1)
     30  END DO
     31!$OMP END DO
     32!$OMP MASTER
     33  w(ijb:ije,1)=0.
     34!$OMP END MASTER
     35!$OMP BARRIER
    536
    6 c=======================================================================
    7 c
    8 c   Auteurs:  P. Le Van , F. Hourdin .
    9 c   -------
    10 c
    11 c   Objet:
    12 c   ------
    13 c
    14 c    *******************************************************************
    15 c  .... calcul de la vitesse verticale aux niveaux sigma  ....
    16 c    *******************************************************************
    17 c     convm   est un argument  d'entree pour le s-pg  ......
    18 c       w     est un argument de sortie pour le s-pg  ......
    19 c
    20 c    la vitesse verticale est orientee de  haut en bas .
    21 c    au sol, au niveau sigma(1),   w(i,j,1) = 0.
    22 c    au sommet, au niveau sigma(llm+1) , la vit.verticale est aussi
    23 c    egale a 0. et n'est pas stockee dans le tableau w  .
    24 c
    25 c
    26 c=======================================================================
     37END SUBROUTINE vitvert_loc
    2738
    28 #include "dimensions.h"
    29 #include "paramet.h"
    30 #include "comvert.h"
    31 
    32       REAL w(ijb_u:ije_u,llm),convm(ijb_u:ije_u,llm)
    33       INTEGER   l, ij,ijb,ije
    34 
    35 
    36       ijb=ij_begin
    37       ije=ij_end+iip1
    38      
    39       if (pole_sud) ije=ij_end
    40 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)     
    41       DO 2  l = 1,llmm1
    42 
    43       DO 1 ij = ijb,ije
    44       w( ij, l+1 ) = convm( ij, l+1 ) - bp(l+1) * convm( ij, 1 )
    45    1  CONTINUE
    46 
    47    2  CONTINUE
    48 c$OMP END DO
    49 c$OMP MASTER
    50       DO 5 ij  = ijb,ije
    51       w(ij,1)  = 0.
    52 5     CONTINUE
    53 c$OMP END MASTER
    54 c$OMP BARRIER
    55       RETURN
    56       END
  • LMDZ5/trunk/libf/dynlonlat_phylonlat/phylmd/ce0l.F90

    r2331 r2336  
    11PROGRAM ce0l
    2   !
    3   ! Purpose: Calls etat0, creates initial states and limit_netcdf
    4   !
    5   ! interbar=.T. for barycentric interpolation inter_barxy
    6   ! extrap  =.T. for data extrapolation, like for the SSTs when file does not
    7   !                  contain ocean points only.
    8   ! oldice  =.T. for old-style ice, obtained using grille_m (grid_atob).
    9   ! masque is created in etat0, passed to limit to ensure consistancy.
    10 
    11   USE control_mod, only: DAY_STEP, DAYREF, NSPLIT_PHYS
    12   USE etat0dyn, only: etat0dyn_netcdf
    13   USE netcdf, ONLY: NF90_OPEN, NF90_NOWRITE, NF90_CLOSE, NF90_NOERR
     2!
     3!-------------------------------------------------------------------------------
     4! Purpose: Initial states and boundary conditions files creation:
     5!     * start.nc    for dynamics    (using etat0dyn     routine)
     6!     * startphy.nc for physics     (using etat0phys    routine)
     7!     * limit.nc    for forced runs (using limit_netcdf routine)
     8!-------------------------------------------------------------------------------
     9! Notes:
     10!     * extrap=.T. (default) for data extrapolation, like for the SSTs when file
     11!                   does contain ocean points only.
     12!     * "masque" can be:
     13!       - read from file "o2a.nc"          (for coupled runs).
     14!       - created in etat0phys or etat0dyn (for forced  runs).
     15!     It is then passed to limit_netcdf to ensure consistancy.
     16!-------------------------------------------------------------------------------
    1417  USE ioipsl, ONLY: ioconf_calendar, getin, flininfo, flinopen, flinget, flinclo
    15 
    16   USE etat0phys, only: etat0phys_netcdf
    17   USE dimphy, only: KLON
    18   USE infotrac, only: TYPE_TRAC, infotrac_init
     18  USE control_mod,    ONLY: day_step, dayref, nsplit_phys
     19  USE etat0dyn,       ONLY: etat0dyn_netcdf
     20  USE etat0phys,      ONLY: etat0phys_netcdf
     21  USE limit,          ONLY: limit_netcdf
     22  USE netcdf,         ONLY: NF90_OPEN, NF90_NOWRITE, NF90_CLOSE, NF90_NOERR
     23  USE infotrac,       ONLY: type_trac, infotrac_init
     24  USE dimphy,         ONLY: klon
    1925  USE test_disvert_m, ONLY: test_disvert
     26  USE filtreg_mod,    ONLY: inifilr
     27#ifdef inca
     28  USE indice_sol_mod, ONLY: nbsrf, is_oce, is_sic, is_ter, is_lic
     29#endif
     30#ifdef CPP_PARA
     31  USE mod_const_mpi,  ONLY: init_const_mpi
     32  USE parallel_lmdz,  ONLY: init_parallel, mpi_rank, omp_rank, mpi_size
     33  USE bands,          ONLY: read_distrib, distrib_phys
     34  USE mod_hallo,      ONLY: init_mod_hallo
     35  USE mod_interface_dyn_phys, ONLY: init_interface_dyn_phys
     36#endif
    2037
    2138  IMPLICIT NONE
    2239
    23   ! Local variables:
     40!-------------------------------------------------------------------------------
     41! Local variables:
    2442  include "dimensions.h"
    2543  include "paramet.h"
    26   include "comgeom.h"
     44  include "comgeom2.h"
    2745  include "comconst.h"
    2846  include "comvert.h"
     
    3048  include "temps.h"
    3149  include "logic.h"
    32   REAL               :: masque(iip1, jjp1)             !--- CONTINENTAL MASK
    33   REAL               :: phis  (iip1, jjp1)             !--- GROUND GEOPOTENTIAL
     50  REAL               :: masque(iip1,jjp1)             !--- CONTINENTAL MASK
     51  REAL               :: phis  (iip1,jjp1)             !--- GROUND GEOPOTENTIAL
    3452  CHARACTER(LEN=256) :: modname, fmt, calnd           !--- CALENDAR TYPE
    3553  LOGICAL            :: use_filtre_fft
    36   LOGICAL, PARAMETER :: interbar=.TRUE., extrap=.FALSE., oldice=.FALSE.
    37 
    38   !--- Local variables for ocean mask reading:
     54  LOGICAL, PARAMETER :: extrap=.FALSE.
     55
     56!--- Local variables for ocean mask reading:
    3957  INTEGER            :: nid_o2a, iml_omask, jml_omask, j
    4058  INTEGER            :: fid, iret, llm_tmp, ttm_tmp, itaul(1)
    41   REAL, ALLOCATABLE  :: lon_omask(:, :), dlon_omask(:), ocemask(:, :)
    42   REAL, ALLOCATABLE  :: lat_omask(:, :), dlat_omask(:), ocetmp (:, :)
     59  REAL, ALLOCATABLE  :: lon_omask(:,:), dlon_omask(:), ocemask(:,:)
     60  REAL, ALLOCATABLE  :: lat_omask(:,:), dlat_omask(:), ocetmp (:,:)
    4361  REAL               :: date, lev(1)
    44 
    45   !----------------------------------------------------------------------
     62!-------------------------------------------------------------------------------
    4663  modname="ce0l"
    4764
    48   !--- Constants
     65!--- Constants
    4966  pi     = 4. * ATAN(1.)
    5067  rad    = 6371229.
     
    5976
    6077  CALL conf_gcm( 99, .TRUE. )
    61 
    6278  dtvr = daysec/REAL(day_step)
    63   WRITE(lunout, *)'dtvr', dtvr
    64 
     79  WRITE(lunout,*)'dtvr',dtvr
    6580  CALL iniconst()
    6681  CALL inigeom()
    6782
     83!--- Calendar choice
    6884#ifdef CPP_IOIPSL
    6985  calnd='gregorian'
    7086  SELECT CASE(calend)
    71   CASE('earth_360d')
    72      CALL ioconf_calendar('360d')
    73      calnd='with 360 days/year'
    74   CASE('earth_365d')
    75      CALL ioconf_calendar('noleap')
    76      calnd='with no leap year'
    77   CASE('earth_366d')
    78      CALL ioconf_calendar('366d')
    79      calnd='with leap years only'
    80   CASE('gregorian')
    81      CALL ioconf_calendar('gregorian')
    82   CASE('standard')
    83      CALL ioconf_calendar('gregorian')
    84   CASE('julian')
    85      CALL ioconf_calendar('julian')
    86      calnd='julian'
    87   CASE('proleptic_gregorian')
    88      CALL ioconf_calendar('gregorian')
    89      !--- DC Bof...  => IOIPSL a mettre a jour: proleptic_gregorian /= gregorian
    90   CASE DEFAULT
    91      CALL abort_gcm('ce0l', 'Bad choice for calendar', 1)
     87    CASE('earth_360d');CALL ioconf_calendar('360d');   calnd='with 360 days/year'
     88    CASE('earth_365d');CALL ioconf_calendar('noleap'); calnd='with no leap year'
     89    CASE('earth_366d');CALL ioconf_calendar('366d');   calnd='with leap years only'
     90    CASE('gregorian'); CALL ioconf_calendar('gregorian')
     91    CASE('standard');  CALL ioconf_calendar('gregorian')
     92    CASE('julian');    CALL ioconf_calendar('julian'); calnd='julian'
     93    CASE('proleptic_gregorian'); CALL ioconf_calendar('gregorian')
     94  !--- DC Bof...  => IOIPSL a mettre a jour: proleptic_gregorian /= gregorian
     95    CASE DEFAULT
     96      CALL abort_gcm('ce0l','Bad choice for calendar',1)
    9297  END SELECT
    93   WRITE(lunout, *)'CHOSEN CALENDAR: Earth '//TRIM(calnd)
    94 #endif
    95 
    96   use_filtre_fft=.FALSE.
    97   CALL getin('use_filtre_fft', use_filtre_fft)
    98   IF(use_filtre_fft) THEN
    99      WRITE(lunout, *)"FFT filter not available for sequential dynamics."
    100      WRITE(lunout, *)"Your setting of variable use_filtre_fft is not used."
    101   ENDIF
    102 
    103   !--- LAND MASK. TWO CASES:
    104   !   1) read from ocean model    file "o2a.nc"    (coupled runs)
    105   !   2) computed from topography file "Relief.nc" (masque(:, :)=-99999.)
    106   ! Coupled simulations (case 1) use the ocean model mask to compute the
    107   ! weights to ensure ocean fractions are the same for atmosphere and ocean.
    108 
    109   IF(NF90_OPEN("o2a.nc", NF90_NOWRITE, nid_o2a)/=NF90_NOERR) THEN
    110      WRITE(lunout, *)'BEWARE !! No ocean mask "o2a.nc" file found'
    111      WRITE(lunout, *)'Forced run.'
    112      masque(:, :)=-99999.
    113   ELSE
    114      iret=NF90_CLOSE(nid_o2a)
    115      WRITE(lunout, *)'BEWARE !! Ocean mask "o2a.nc" file found'
    116      WRITE(lunout, *)'Coupled run.'
    117      CALL flininfo("o2a.nc", iml_omask, jml_omask, llm_tmp, ttm_tmp, nid_o2a)
    118      IF(iml_omask/=iim .OR.jml_omask/=jjp1) THEN
    119         WRITE(lunout, *)'Mismatching dimensions for ocean mask'
    120         WRITE(lunout, *)'iim  = ', iim , ' iml_omask = ', iml_omask
    121         WRITE(lunout, *)'jjp1 = ', jjp1, ' jml_omask = ', jml_omask
    122         CALL abort_gcm(modname, '', 1)
    123      END IF
    124      ALLOCATE(ocemask(iim, jjp1), lon_omask(iim, jjp1), dlon_omask(iim ))
    125      ALLOCATE(ocetmp (iim, jjp1), lat_omask(iim, jjp1), dlat_omask(jjp1))
    126      CALL flinopen("o2a.nc", .FALSE., iim, jjp1, llm_tmp, lon_omask, &
    127           lat_omask, lev, ttm_tmp, itaul, date, dt, fid)
    128      CALL flinget(fid, "OceMask",    iim, jjp1, llm_tmp, ttm_tmp, 1, 1, ocetmp)
    129      CALL flinclo(fid)
    130      dlon_omask(1:iim ) = lon_omask(1:iim, 1)
    131      dlat_omask(1:jjp1) = lat_omask(1, 1:jjp1)
    132      ocemask = ocetmp
    133      IF(dlat_omask(1)<dlat_omask(jml_omask)) THEN
    134         DO j=1, jjp1
    135            ocemask(:, j) = ocetmp(:, jjp1-j+1)
    136         END DO
    137      END IF
    138      DEALLOCATE(ocetmp, lon_omask, lat_omask, dlon_omask, dlat_omask)
    139      IF(prt_level>=1) THEN
    140         WRITE(fmt, "(i4, 'i1)')")iim
    141         fmt='('//ADJUSTL(fmt)
    142         WRITE(lunout, *)'OCEAN MASK :'
    143         WRITE(lunout, fmt) NINT(ocemask)
    144      END IF
    145      masque(1:iim, :)=1.-ocemask(:, :)
    146      masque(iip1 , :)=masque(1, :)
    147      DEALLOCATE(ocemask)
    148   END IF
    149   phis(:, :)=-99999.
    150 
    151   CALL Init_Phys_lmdz(iim, jjp1, llm, 1, (/(jjm-1)*iim+2/))
    152   WRITE(lunout, *)'---> klon=', klon
    153 
    154   call infotrac_init
    155   CALL iniphysiq(iim, jjm, llm, daysec, dayref, dtphys / nsplit_phys, rlatu, &
    156        rlonv, aire, cu, cv, rad, g, r, cpp, iflag_phys)
    157 
    158   IF(pressure_exner) CALL test_disvert
    159 
     98  WRITE(lunout,*)'CHOSEN CALENDAR: Earth '//TRIM(calnd)
     99#endif
     100
     101#ifdef CPP_PARA
     102!--- Physical grid + parallel initializations
     103  CALL init_const_mpi()
     104  CALL init_parallel()
     105  CALL read_distrib()
     106  CALL init_mod_hallo()
     107  CALL Init_Phys_lmdz(iim,jjp1,llm,mpi_size,distrib_phys)
     108  CALL init_interface_dyn_phys()
     109#else
     110  CALL Init_Phys_lmdz(iim,jjp1,llm,1,(/(jjm-1)*iim+2/))
     111#endif
     112  WRITE(lunout,*)'---> klon=',klon
     113
     114!--- Tracers initializations
    160115  IF (type_trac == 'inca') THEN
    161116#ifdef INCA
    162      CALL init_const_lmdz(nbtr, anneeref, dayref, iphysiq, day_step, nday)
    163      CALL init_inca_para(iim, jjm+1, klon, 1, klon_mpi_para_nb, 0)
    164      WRITE(lunout, *)'nbtr =' , nbtr
    165 #endif
    166   END IF
     117    CALL init_const_lmdz(nbtr,anneeref,dayref,iphysiq,day_step,nday,&
     118                         nbsrf,is_oce,is_sic,is_ter,is_lic,calend)
     119    CALL init_inca_para(iim,jjp1,llm,klon_glo,mpi_size,distrib_phys,&
     120                        COMM_LMDZ)
     121    WRITE(lunout,*)'nbtr =' , nbtr
     122#endif
     123  END IF
     124  CALL infotrac_init()
     125
     126  CALL inifilr()
     127  CALL iniphysiq(iim,jjm,llm,daysec,day_ini,dtphys/nsplit_phys, &
     128                 rlatu,rlonv,aire,cu,cv,rad,g,r,cpp,iflag_phys)
     129  IF(pressure_exner) CALL test_disvert
     130
     131#ifdef CPP_PARA
     132  IF (mpi_rank==0.AND.omp_rank==0) THEN
     133#endif
     134  use_filtre_fft=.FALSE.
     135  CALL getin('use_filtre_fft',use_filtre_fft)
     136  IF(use_filtre_fft) THEN
     137     WRITE(lunout,*)"FFT filter not available for sequential dynamics."
     138     WRITE(lunout,*)"Your setting of variable use_filtre_fft is not used."
     139  ENDIF
     140
     141!--- LAND MASK. TWO CASES:
     142!   1) read from ocean model    file "o2a.nc"    (coupled runs)
     143!   2) computed from topography file "Relief.nc" (masque(:,:)=-99999.)
     144! Coupled simulations (case 1) use the ocean model mask to compute the
     145! weights to ensure ocean fractions are the same for atmosphere and ocean.
     146!*******************************************************************************
     147  IF(NF90_OPEN("o2a.nc", NF90_NOWRITE, nid_o2a)/=NF90_NOERR) THEN
     148    WRITE(lunout,*)'BEWARE !! No ocean mask "o2a.nc" file found'
     149    WRITE(lunout,*)'Forced run.'
     150    masque(:,:)=-99999.
     151  ELSE
     152    iret=NF90_CLOSE(nid_o2a)
     153    WRITE(lunout,*)'BEWARE !! Ocean mask "o2a.nc" file found'
     154    WRITE(lunout,*)'Coupled run.'
     155    CALL flininfo("o2a.nc", iml_omask, jml_omask, llm_tmp, ttm_tmp, nid_o2a)
     156    IF(iml_omask/=iim .OR.jml_omask/=jjp1) THEN
     157      WRITE(lunout,*)'Mismatching dimensions for ocean mask'
     158      WRITE(lunout,*)'iim  = ',iim ,' iml_omask = ',iml_omask
     159      WRITE(lunout,*)'jjp1 = ',jjp1,' jml_omask = ',jml_omask
     160      CALL abort_gcm(modname,'',1)
     161    END IF
     162    ALLOCATE(ocemask(iim,jjp1),lon_omask(iim,jjp1),dlon_omask(iim ))
     163    ALLOCATE(ocetmp (iim,jjp1),lat_omask(iim,jjp1),dlat_omask(jjp1))
     164    CALL flinopen("o2a.nc", .FALSE.,iim,jjp1,llm_tmp,lon_omask,lat_omask,lev,  &
     165     &                                       ttm_tmp,itaul,date,dt,fid)
     166    CALL flinget(fid, "OceMask",    iim,jjp1,llm_tmp,ttm_tmp,1,1,ocetmp)
     167    CALL flinclo(fid)
     168    dlon_omask(1:iim ) = lon_omask(1:iim,1)
     169    dlat_omask(1:jjp1) = lat_omask(1,1:jjp1)
     170    ocemask = ocetmp
     171    IF(dlat_omask(1)<dlat_omask(jml_omask)) THEN
     172      DO j=1,jjp1; ocemask(:,j) = ocetmp(:,jjp1-j+1); END DO
     173    END IF
     174    DEALLOCATE(ocetmp,lon_omask,lat_omask,dlon_omask,dlat_omask)
     175    IF(prt_level>=1) THEN
     176      WRITE(fmt,"(i4,'i1)')")iim ; fmt='('//ADJUSTL(fmt)
     177      WRITE(lunout,*)'OCEAN MASK :'
     178      WRITE(lunout,fmt) NINT(ocemask)
     179    END IF
     180    masque(1:iim,:)=1.-ocemask(:,:)
     181    masque(iip1 ,:)=masque(1,:)
     182    DEALLOCATE(ocemask)
     183  END IF
     184  phis(:,:)=-99999.
     185
    167186  IF(ok_etat0) THEN
    168      WRITE(lunout, '(//)')
    169      WRITE(lunout, *) '  ************************  '
    170      WRITE(lunout, *) '  ***  etat0phy_netcdf ***  '
    171      WRITE(lunout, *) '  ************************  '
    172      WRITE(lunout, '(//)')
    173      WRITE(lunout, *) ' interbar = ', interbar
    174      CALL etat0phys_netcdf(interbar, masque, phis)
    175   END IF
    176 
    177   IF(ok_etat0) THEN
    178      WRITE(lunout, '(//)')
    179      WRITE(lunout, *) '  ************************  '
    180      WRITE(lunout, *) '  ***  etat0dyn_netcdf ***  '
    181      WRITE(lunout, *) '  ************************  '
    182      WRITE(lunout, '(//)')
    183      WRITE(lunout, *) ' interbar = ', interbar
    184      CALL etat0dyn_netcdf(interbar, masque, phis)
     187    WRITE(lunout,'(//)')
     188    WRITE(lunout,*) '  ************************  '
     189    WRITE(lunout,*) '  ***  etat0phy_netcdf ***  '
     190    WRITE(lunout,*) '  ************************  '
     191    CALL etat0phys_netcdf(masque,phis)
     192    WRITE(lunout,'(//)')
     193    WRITE(lunout,*) '  ************************  '
     194    WRITE(lunout,*) '  ***  etat0dyn_netcdf ***  '
     195    WRITE(lunout,*) '  ************************  '
     196    CALL etat0dyn_netcdf(masque,phis)
    185197  END IF
    186198
    187199  IF(ok_limit) THEN
    188      WRITE(lunout, '(//)')
    189      WRITE(lunout, *) '  *********************  '
    190      WRITE(lunout, *) '  ***  Limit_netcdf ***  '
    191      WRITE(lunout, *) '  *********************  '
    192      WRITE(lunout, '(//)')
    193      CALL limit_netcdf(interbar, extrap, oldice, masque)
    194   END IF
    195 
    196   WRITE(lunout, '(//)')
    197   WRITE(lunout, *) '  ***************************  '
    198   WRITE(lunout, *) '  ***  grilles_gcm_netcdf ***  '
    199   WRITE(lunout, *) '  ***************************  '
    200   WRITE(lunout, '(//)')
    201   CALL grilles_gcm_netcdf_sub(masque, phis)
     200    WRITE(lunout,'(//)')
     201    WRITE(lunout,*) '  *********************  '
     202    WRITE(lunout,*) '  ***  Limit_netcdf ***  '
     203    WRITE(lunout,*) '  *********************  '
     204    WRITE(lunout,'(//)')
     205    CALL limit_netcdf(masque,phis,extrap)
     206  END IF
     207
     208  WRITE(lunout,'(//)')
     209  WRITE(lunout,*) '  ***************************  '
     210  WRITE(lunout,*) '  ***  grilles_gcm_netcdf ***  '
     211  WRITE(lunout,*) '  ***************************  '
     212  WRITE(lunout,'(//)')
     213  CALL grilles_gcm_netcdf_sub(masque,phis)
     214
     215#ifdef CPP_PARA
     216  END IF
     217#endif
    202218
    203219END PROGRAM ce0l
     220!
     221!-------------------------------------------------------------------------------
  • LMDZ5/trunk/libf/dynlonlat_phylonlat/phylmd/etat0dyn_netcdf.F90

    r2334 r2336  
    1212!  routine (to be called after restget):
    1313!    CALL startget_dyn3d(varname, lon_in,  lat_in, pls, workvar,&
    14 !                          champ, lon_in2, lat_in2, ibar)
     14!                          champ, lon_in2, lat_in2)
    1515!
    1616!    *  Variables should have the following names in the NetCDF files:
     
    3636  USE ioipsl,         ONLY: flininfo, flinopen, flinget, flinclo, histclo
    3737  USE assert_eq_m,    ONLY: assert_eq
    38 #ifdef CPP_PHYS
    3938  USE indice_sol_mod, ONLY: epsfra
    40 #endif
    4139  IMPLICIT NONE
    4240
     
    5452  include "serre.h"
    5553  REAL, SAVE :: deg2rad
    56 #ifndef CPP_PHYS
    57   REAL, SAVE :: epsfra= 1.E-5
    58 #endif
    5954  INTEGER,            SAVE      :: iml_dyn, jml_dyn, llm_dyn, ttm_dyn, fid_dyn
    6055  REAL, ALLOCATABLE,  SAVE      :: lon_dyn(:,:), lat_dyn(:,:), levdyn_ini(:)
    6156  CHARACTER(LEN=120), PARAMETER :: dynfname='ECDYN.nc'
    62   CHARACTER(LEN=120), PARAMETER :: orofname='Relief.nc'
    6357
    6458CONTAINS
     
    6660!-------------------------------------------------------------------------------
    6761!
    68 SUBROUTINE etat0dyn_netcdf(ib, masque, phis)
     62SUBROUTINE etat0dyn_netcdf(masque, phis)
    6963!
    7064!-------------------------------------------------------------------------------
     
    7367! Notes:  1) This routine is designed to work for Earth
    7468!         2) If masque(:,:)/=-99999., masque and phis are already known.
    75 !         Otherwise: read it from ocean model file (coupled run) or compute it.
     69!         Otherwise: compute it.
    7670!-------------------------------------------------------------------------------
    7771  USE control_mod
    78 #ifdef CPP_PHYS
    7972  USE regr_lat_time_coefoz_m, ONLY: regr_lat_time_coefoz
    8073  USE regr_pr_o3_m,   ONLY: regr_pr_o3
    8174  USE press_coefoz_m, ONLY: press_coefoz
    82 #endif
    8375  USE exner_hyb_m,    ONLY: exner_hyb
    8476  USE exner_milieu_m, ONLY: exner_milieu
    85   USE infotrac, only: NQTOT, TNAME
     77  USE infotrac,       ONLY: nqtot, tname
    8678  USE filtreg_mod
    8779  IMPLICIT NONE
    8880!-------------------------------------------------------------------------------
    8981! Arguments:
    90   LOGICAL, INTENT(IN)    :: ib                  !--- Barycentric interpolation
    9182  REAL,    INTENT(INOUT) :: masque(iip1,jjp1)   !--- Land-ocean mask
    9283  REAL,    INTENT(INOUT) :: phis  (iip1,jjp1)   !--- Ground geopotential
     
    111102  deg2rad = pi/180.0
    112103
    113 ! Initializations for tracers and filter
    114 !*******************************************************************************
    115   CALL inifilr()
    116 
    117104! Compute ground geopotential and possibly the mask.
    118105!*******************************************************************************
    119106  masque_tmp(:,:)=masque(:,:)
    120   CALL start_init_orog0(rlonv, rlatu, phis, masque_tmp)
    121107  WRITE(fmt,"(i4,'i1)')")iip1 ; fmt='('//ADJUSTL(fmt)
    122108  IF(ALL(masque==-99999.)) THEN                         !--- KEEP NEW MASK
     
    132118! Compute psol AND tsol, knowing phis.
    133119!*******************************************************************************
    134   CALL start_init_dyn(rlonv, rlatu, rlonu, rlatv, ib, phis, psol)
     120  CALL start_init_dyn(rlonv, rlatu, rlonu, rlatv, phis, psol)
    135121
    136122! Mid-levels pressure computation
     
    147133!*******************************************************************************
    148134  uvent(:,:,:) = 0.0 ; vvent(:,:,:) = 0.0 ; t3d (:,:,:) = 0.0
    149   CALL startget_dyn3d('u'   ,rlonu,rlatu,pls,y ,uvent,rlonv,rlatv,ib)
     135  CALL startget_dyn3d('u'   ,rlonu,rlatu,pls,y ,uvent,rlonv,rlatv)
    150136  CALL startget_dyn3d('v'   ,rlonv,rlatv,pls(:,:jjm,:),y(:,:jjm,:),vvent,      &
    151  &                           rlonu,rlatu(:jjm),ib)
    152   CALL startget_dyn3d('t'   ,rlonv,rlatu,pls,y ,t3d ,rlonu,rlatv,ib)
     137 &                           rlonu,rlatu(:jjm))
     138  CALL startget_dyn3d('t'   ,rlonv,rlatu,pls,y ,t3d ,rlonu,rlatv)
    153139  tpot(:,:,:)=t3d(:,:,:)
    154   CALL startget_dyn3d('tpot',rlonv,rlatu,pls,pk,tpot,rlonu,rlatv,ib)
     140  CALL startget_dyn3d('tpot',rlonv,rlatu,pls,pk,tpot,rlonu,rlatv)
    155141
    156142  WRITE(lunout,*) 'T3D min,max:',MINVAL(t3d(:,:,:)),MAXVAL(t3d(:,:,:))
     
    165151!  WRITE(lunout,*) 'QSAT :',qsat(10,20,:)
    166152  qd (:,:,:) = 0.0
    167   CALL startget_dyn3d('q',rlonv,rlatu,pls,qsat,qd,rlonu,rlatv,ib)
     153  CALL startget_dyn3d('q',rlonv,rlatu,pls,qsat,qd,rlonu,rlatv)
    168154  ALLOCATE(q3d(iip1,jjp1,llm,nqtot)); q3d(:,:,:,:)=0.0 ; q3d(:,:,:,1)=qd(:,:,:)
    169155  CALL flinclo(fid_dyn)
    170156
    171 #ifdef CPP_PHYS
    172157! Parameterization of ozone chemistry:
    173158!*******************************************************************************
     
    180165    q3d(:,:,:,i)=q3d(:,:,:,i)*48./ 29.                  !--- Mole->mass fraction         
    181166  END IF
    182 
    183 #endif
    184167  q3d(iip1,:,:,:)=q3d(1,:,:,:)
    185 
    186 ! Intermediate computation
    187 !*******************************************************************************
    188   CALL massdair(p3d,masse)
    189   WRITE(lunout,*)' ALPHAX ',alphax
    190   DO l=1,llm
    191     xppn(:)=aire(1:iim,1   )*masse(1:iim,1   ,l)
    192     xpps(:)=aire(1:iim,jjp1)*masse(1:iim,jjp1,l)
    193     xpn=SUM(xppn)/apoln
    194     xps=SUM(xpps)/apols
    195     masse(:,1   ,l)=xpn
    196     masse(:,jjp1,l)=xps
    197   END DO
    198168
    199169! Writing
     
    215185  CALL geopot( ip1jmp1, tpot, pk, pks, phis, phi )
    216186  WRITE(lunout,*)'sortie geopot'
    217   CALL caldyn0( itau, uvent, vvent, tpot, psol, pk, phis,               &
    218                 phi,  w, time+iday-dayref)
     187  CALL caldyn0( itau, uvent, vvent, tpot, psol, masse, pk, phis,               &
     188                phi,  w, pbaru, pbarv, time+iday-dayref)
    219189  WRITE(lunout,*)'sortie caldyn0'     
     190#ifdef CPP_PARA
     191  CALL dynredem0_loc( "start.nc", dayref, phis)
     192#else
    220193  CALL dynredem0( "start.nc", dayref, phis)
     194#endif
    221195  WRITE(lunout,*)'sortie dynredem0'
     196#ifdef CPP_PARA
     197  CALL dynredem1_loc( "start.nc", 0.0, vvent, uvent, tpot, q3d, masse, psol)
     198#else
    222199  CALL dynredem1( "start.nc", 0.0, vvent, uvent, tpot, q3d, masse, psol)
     200#endif
    223201  WRITE(lunout,*)'sortie dynredem1'
    224202  CALL histclo()
     
    232210!
    233211SUBROUTINE startget_dyn3d(var, lon_in,  lat_in,  pls,  workvar,&
    234                         champ, lon_in2, lat_in2, ibar)
     212                        champ, lon_in2, lat_in2)
    235213!-------------------------------------------------------------------------------
    236214  IMPLICIT NONE
     
    252230  REAL,             INTENT(IN)    :: lon_in2(:)       ! dim (iml)
    253231  REAL,             INTENT(IN)    :: lat_in2(:)       ! dim (jml2)
    254   LOGICAL,          INTENT(IN)    :: ibar
    255232!-------------------------------------------------------------------------------
    256233! Local variables:
     
    287264!--- INTERPOLATE 3D FIELD IF NEEDED
    288265  IF(var/='tpot') CALL start_inter_3d(TRIM(vname),lon_in,lat_in,lon_in2,      &
    289                                                   lat_in2,pls,champ,ibar)
     266                                                  lat_in2,pls,champ)
    290267
    291268!--- COMPUTE THE REQUIRED FILED
     
    317294!-------------------------------------------------------------------------------
    318295!
    319 SUBROUTINE start_init_orog0(lon_in,lat_in,phis,masque)
    320 !
    321 !-------------------------------------------------------------------------------
    322   USE conf_dat_m, ONLY: conf_dat2d
    323   IMPLICIT NONE
    324 !===============================================================================
    325 ! Purpose:  Compute "phis" just like it would be in start_init_orog.
    326 !===============================================================================
    327 ! Arguments:
    328   REAL, INTENT(IN)    :: lon_in(:), lat_in(:)   ! dim (iml) (jml)
    329   REAL, INTENT(INOUT) :: phis(:,:), masque(:,:) ! dim (iml,jml)
    330 !-------------------------------------------------------------------------------
    331 ! Local variables:
    332   CHARACTER(LEN=256) :: modname="start_init_orog0"
    333   CHARACTER(LEN=256) :: title="RELIEF"
    334   INTEGER            :: fid, llm_tmp,ttm_tmp, iml,jml, iml_rel,jml_rel, itau(1)
    335   REAL               :: lev(1), date, dt
    336   REAL, ALLOCATABLE  :: lon_rad(:), lon_ini(:), lon_rel(:,:), relief_hi(:,:)
    337   REAL, ALLOCATABLE  :: lat_rad(:), lat_ini(:), lat_rel(:,:)
    338 !-------------------------------------------------------------------------------
    339   iml=assert_eq(SIZE(lon_in),SIZE(phis,1),SIZE(masque,1),TRIM(modname)//" iml")
    340   jml=assert_eq(SIZE(lat_in),SIZE(phis,2),SIZE(masque,2),TRIM(modname)//" jml")
    341   IF(iml/=iip1) CALL abort_gcm(TRIM(modname),'iml/=iip1',1)
    342   IF(jml/=jjp1) CALL abort_gcm(TRIM(modname),'jml/=jjp1',1)
    343   pi=2.0*ASIN(1.0); deg2rad=pi/180.0
    344   IF(ANY(phis/=-99999.)) RETURN                  !--- phis ALREADY KNOWN
    345 
    346 !--- HIGH RESOLUTION OROGRAPHY
    347   CALL flininfo(orofname, iml_rel, jml_rel, llm_tmp, ttm_tmp, fid)
    348 
    349   ALLOCATE(lat_rel(iml_rel,jml_rel),lon_rel(iml_rel,jml_rel))
    350   CALL flinopen(orofname, .FALSE., iml_rel, jml_rel, llm_tmp, lon_rel, lat_rel,&
    351                 lev, ttm_tmp, itau, date, dt, fid)
    352   ALLOCATE(relief_hi(iml_rel,jml_rel))
    353   CALL flinget(fid, title, iml_rel, jml_rel, llm_tmp, ttm_tmp, 1, 1, relief_hi)
    354   CALL flinclo(fid)
    355 
    356 !--- IF ANGLES ARE IN DEGREES, THEY ARE CONVERTED INTO RADIANS
    357   ALLOCATE(lon_ini(iml_rel),lat_ini(jml_rel))
    358   lon_ini(:)=lon_rel(:,1); IF(MAXVAL(lon_rel)>pi) lon_ini=lon_ini*deg2rad
    359   lat_ini(:)=lat_rel(1,:); IF(MAXVAL(lat_rel)>pi) lat_ini=lat_ini*deg2rad
    360 
    361 !--- FIELDS ARE PROCESSED TO BE ON STANDARD ANGULAR DOMAINS
    362   ALLOCATE(lon_rad(iml_rel),lat_rad(jml_rel))
    363   CALL conf_dat2d(title, lon_ini, lat_ini, lon_rad, lat_rad, relief_hi, .FALSE.)
    364   DEALLOCATE(lon_ini,lat_ini)
    365 
    366 !--- COMPUTING SURFACE GEOPOTENTIAL USING ROUTINE grid_noro0
    367   WRITE(lunout,*)
    368   WRITE(lunout,*)'*** Compute surface geopotential ***'
    369 
    370 !--- CALL OROGRAPHY MODULE (REDUCED VERSION) TO COMPUTE FIELDS
    371   CALL grid_noro0(lon_rad, lat_rad, relief_hi, lon_in, lat_in, phis, masque)
    372   phis = phis * 9.81
    373   phis(iml,:) = phis(1,:)
    374   DEALLOCATE(relief_hi,lon_rad,lat_rad)
    375 
    376 END SUBROUTINE start_init_orog0
    377 !
    378 !-------------------------------------------------------------------------------
    379 
    380 
    381 !-------------------------------------------------------------------------------
    382 !
    383 SUBROUTINE grid_noro0(xd,yd,zd,x,y,zphi,mask)
    384 !
    385 !===============================================================================
    386 ! Purpose: Extracted from grid_noro to provide geopotential height for dynamics
    387 !          without any call to physics subroutines.
    388 !===============================================================================
    389   IMPLICIT NONE
    390 !-------------------------------------------------------------------------------
    391 ! Arguments:
    392   REAL, INTENT(IN)   :: xd(:), yd(:) !--- INPUT  COORDINATES     (imdp) (jmdp)
    393   REAL, INTENT(IN)   :: zd(:,:)      !--- INPUT  FIELD           (imdp,jmdp)
    394   REAL, INTENT(IN)   :: x(:), y(:)   !--- OUTPUT COORDINATES     (imar+1) (jmar)
    395   REAL, INTENT(OUT)  :: zphi(:,:)    !--- GEOPOTENTIAL           (imar+1,jmar)
    396   REAL, INTENT(INOUT):: mask(:,:)    !--- MASK                   (imar+1,jmar)
    397 !-------------------------------------------------------------------------------
    398 ! Local variables:
    399   CHARACTER(LEN=256) :: modname="grid_noro0"
    400   REAL, ALLOCATABLE :: xusn(:), yusn(:)           ! dim (imdp+2*iext) (jmdp+2)
    401   REAL, ALLOCATABLE :: zusn(:,:)                  ! dim (imdp+2*iext,jmdp+2)
    402   REAL, ALLOCATABLE :: weight(:,:)                ! dim (imar+1,jmar)
    403   REAL, ALLOCATABLE :: mask_tmp(:,:), zmea(:,:)   ! dim (imar+1,jmar)
    404   REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imax,jmax)
    405   REAL, ALLOCATABLE :: a(:), b(:)                 ! dim (imax)
    406   REAL, ALLOCATABLE :: c(:), d(:)                 ! dim (jmax)
    407   LOGICAL :: masque_lu
    408   INTEGER :: i, ii, imdp, imar, iext
    409   INTEGER :: j, jj, jmdp, jmar, nn
    410   REAL    :: xpi, zlenx, weighx, xincr,  zbordnor, zmeanor, zweinor, zbordest
    411   REAL    :: rad, zleny, weighy, masque, zbordsud, zmeasud, zweisud, zbordoue
    412 !-------------------------------------------------------------------------------
    413   imdp=assert_eq(SIZE(xd),SIZE(zd,1),TRIM(modname)//" imdp")
    414   jmdp=assert_eq(SIZE(yd),SIZE(zd,2),TRIM(modname)//" jmdp")
    415   imar=assert_eq(SIZE(x),SIZE(zphi,1),SIZE(mask,1),TRIM(modname)//" imar")-1
    416   jmar=assert_eq(SIZE(y),SIZE(zphi,2),SIZE(mask,2),TRIM(modname)//" jmar")
    417   IF(imar/=iim)   CALL abort_gcm(TRIM(modname),'imar/=iim'  ,1)
    418   IF(jmar/=jjm+1) CALL abort_gcm(TRIM(modname),'jmar/=jjm+1',1)
    419   iext=imdp/10
    420   xpi = ACOS(-1.)
    421   rad = 6371229.
    422 
    423 !--- ARE WE USING A READ MASK ?
    424   masque_lu=ANY(mask/=-99999.); IF(.NOT.masque_lu) mask=0.0
    425   WRITE(lunout,*)'Masque lu: ',masque_lu
    426 
    427 !--- EXTENSION OF THE INPUT DATABASE TO PROCEED COMPUTATIONS AT BOUNDARIES:
    428   ALLOCATE(xusn(imdp+2*iext))
    429   xusn(1     +iext:imdp  +iext)=xd(:)
    430   xusn(1          :       iext)=xd(1+imdp-iext:imdp)-2.*xpi
    431   xusn(1+imdp+iext:imdp+2*iext)=xd(1          :iext)+2.*xpi
    432 
    433   ALLOCATE(yusn(jmdp+2))
    434   yusn(1       )=yd(1)   +(yd(1)   -yd(2))
    435   yusn(2:jmdp+1)=yd(:)
    436   yusn(  jmdp+2)=yd(jmdp)+(yd(jmdp)-yd(jmdp-1))
    437 
    438   ALLOCATE(zusn(imdp+2*iext,jmdp+2))
    439   zusn(1       +iext:imdp  +iext,2:jmdp+1)=zd  (:                   ,     :)
    440   zusn(1            :       iext,2:jmdp+1)=zd  (imdp-iext+1:imdp    ,     :)
    441   zusn(1+imdp  +iext:imdp+2*iext,2:jmdp+1)=zd  (1:iext              ,     :)
    442   zusn(1            :imdp/2+iext,       1)=zusn(1+imdp/2:imdp  +iext,     2)
    443   zusn(1+imdp/2+iext:imdp+2*iext,       1)=zusn(1       :imdp/2+iext,     2)
    444   zusn(1            :imdp/2+iext,  jmdp+2)=zusn(1+imdp/2:imdp  +iext,jmdp+1)
    445   zusn(1+imdp/2+iext:imdp+2*iext,  jmdp+2)=zusn(1       :imdp/2+iext,jmdp+1)
    446 
    447 !--- COMPUTE LIMITS OF MODEL GRIDPOINT AREA (REGULAR GRID)
    448   ALLOCATE(a(imar+1),b(imar+1))
    449   b(1:imar)=(x(1:imar  )+ x(2:imar+1))/2.0
    450   b(imar+1)= x(  imar+1)+(x(  imar+1)-x(imar))/2.0
    451   a(1)=x(1)-(x(2)-x(1))/2.0
    452   a(2:imar+1)= b(1:imar)
    453 
    454   ALLOCATE(c(jmar),d(jmar))
    455   d(1:jmar-1)=(y(1:jmar-1)+ y(2:jmar))/2.0
    456   d(  jmar  )= y(  jmar  )+(y(  jmar)-y(jmar-1))/2.0
    457   c(1)=y(1)-(y(2)-y(1))/2.0
    458   c(2:jmar)=d(1:jmar-1)
    459 
    460 !--- INITIALIZATIONS:
    461   ALLOCATE(weight(imar+1,jmar)); weight(:,:)= 0.0
    462   ALLOCATE(zmea  (imar+1,jmar)); zmea  (:,:)= 0.0
    463 
    464 !--- SUMMATION OVER GRIDPOINT AREA
    465   zleny=xpi/REAL(jmdp)*rad
    466   xincr=xpi/REAL(jmdp)/2.
    467   ALLOCATE(num_tot(imar+1,jmar)); num_tot(:,:)=0.
    468   ALLOCATE(num_lan(imar+1,jmar)); num_lan(:,:)=0.
    469   DO ii = 1, imar+1
    470     DO jj = 1, jmar
    471       DO j = 2,jmdp+1
    472         zlenx  =zleny  *COS(yusn(j))
    473         zbordnor=(xincr+c(jj)-yusn(j))*rad
    474         zbordsud=(xincr-d(jj)+yusn(j))*rad
    475         weighy=AMAX1(0.,AMIN1(zbordnor,zbordsud,zleny))
    476         IF(weighy/=0) THEN
    477           DO i = 2, imdp+2*iext-1
    478             zbordest=(xusn(i)-a(ii)+xincr)*rad*COS(yusn(j))
    479             zbordoue=(b(ii)+xincr-xusn(i))*rad*COS(yusn(j))
    480             weighx=AMAX1(0.,AMIN1(zbordest,zbordoue,zlenx))
    481             IF(weighx/=0)THEN
    482               num_tot(ii,jj)=num_tot(ii,jj)+1.0
    483               IF(zusn(i,j)>=1.)num_lan(ii,jj)=num_lan(ii,jj)+1.0
    484               weight(ii,jj)=weight(ii,jj)+weighx*weighy
    485               zmea  (ii,jj)=zmea  (ii,jj)+zusn(i,j)*weighx*weighy !--- MEAN
    486             END IF
    487           END DO
    488         END IF
    489       END DO
    490     END DO
    491   END DO
    492 
    493 !--- COMPUTE PARAMETERS NEEDED BY LOTT & MILLER (1997) AND LOTT (1999) SSO SCHEME
    494   IF(.NOT.masque_lu) THEN
    495     WHERE(weight(:,1:jmar-1)/=0.0) mask=num_lan(:,:)/num_tot(:,:)
    496   END IF
    497   nn=COUNT(weight(:,1:jmar-1)==0.0)
    498   IF(nn/=0) WRITE(lunout,*)'Problem with weight ; vanishing occurrences: ',nn
    499   WHERE(weight/=0.0) zmea(:,:)=zmea(:,:)/weight(:,:)
    500 
    501 !--- MASK BASED ON GROUND MAXIMUM, 10% THRESHOLD (<10%: SURF PARAMS MEANINGLESS)
    502   ALLOCATE(mask_tmp(imar+1,jmar)); mask_tmp(:,:)=0.0
    503   WHERE(mask>=0.1) mask_tmp = 1.
    504   WHERE(weight(:,:)/=0.0)
    505     zphi(:,:)=mask_tmp(:,:)*zmea(:,:)
    506     zmea(:,:)=mask_tmp(:,:)*zmea(:,:)
    507   END WHERE
    508   WRITE(lunout,*)'  MEAN ORO:' ,MAXVAL(zmea)
    509 
    510 !--- Values at poles
    511   zphi(imar+1,:)=zphi(1,:)
    512 
    513   zweinor=SUM(weight(1:imar,   1),DIM=1)
    514   zweisud=SUM(weight(1:imar,jmar),DIM=1)
    515   zmeanor=SUM(weight(1:imar,   1)*zmea(1:imar,   1),DIM=1)
    516   zmeasud=SUM(weight(1:imar,jmar)*zmea(1:imar,jmar),DIM=1)
    517   zphi(:,1)=zmeanor/zweinor; zphi(:,jmar)=zmeasud/zweisud
    518 
    519 END SUBROUTINE grid_noro0
    520 !
    521 !-------------------------------------------------------------------------------
    522 
    523 
    524 !-------------------------------------------------------------------------------
    525 !
    526 SUBROUTINE start_init_dyn(lon_in,lat_in,lon_in2,lat_in2,ibar,zs,psol)
     296SUBROUTINE start_init_dyn(lon_in,lat_in,lon_in2,lat_in2,zs,psol)
    527297!
    528298!-------------------------------------------------------------------------------
     
    534304  REAL,    INTENT(IN)  :: lon_in (:),  lat_in (:)    ! dim (iml) (jml)
    535305  REAL,    INTENT(IN)  :: lon_in2(:),  lat_in2(:)    ! dim (iml) (jml2)
    536   LOGICAL, INTENT(IN)  :: ibar
    537306  REAL,    INTENT(IN)  :: zs  (:,:)                  ! dim (iml,jml)
    538307  REAL,    INTENT(OUT) :: psol(:,:)                  ! dim (iml,jml)
     
    606375    ALLOCATE(field(iml,jml))
    607376    CALL flinget(fid_dyn, title, iml_dyn,jml_dyn, tllm, ttm_dyn, 1, 1, var_ana)
    608     CALL conf_dat2d(title, lon_ini, lat_ini, lon_rad, lat_rad, var_ana, ibar)
    609     CALL interp_startvar(title, ibar, .TRUE., lon_rad, lat_rad, var_ana,       &
    610                               lon_in, lat_in, lon_in2, lat_in2, field)
     377    CALL conf_dat2d(title, lon_ini, lat_ini, lon_rad, lat_rad, var_ana, .TRUE.)
     378    CALL interp_startvar(title, .TRUE., lon_rad,lat_rad, var_ana,              &
     379                                        lon_in, lat_in, lon_in2, lat_in2, field)
    611380  ELSE IF(SIZE(field)/=SIZE(z)) THEN
    612381    msg='The '//TRIM(msg)//' field we have does not have the right size'
     
    625394!-------------------------------------------------------------------------------
    626395!
    627 SUBROUTINE start_inter_3d(var,lon_in,lat_in,lon_in2,lat_in2,pls_in,var3d,ibar)
     396SUBROUTINE start_inter_3d(var,lon_in,lat_in,lon_in2,lat_in2,pls_in,var3d)
    628397!
    629398!-------------------------------------------------------------------------------
     
    639408  REAL,    INTENT(IN)  :: pls_in(:,:,:)           ! dim (iml,jml,lml)
    640409  REAL,    INTENT(OUT) :: var3d (:,:,:)           ! dim (iml,jml,lml)
    641   LOGICAL, INTENT(IN)  :: ibar
    642410!-------------------------------------------------------------------------------
    643411! Local variables:
     
    667435  ALLOCATE(lon_rad(iml_dyn), lat_rad(jml_dyn), lev_dyn(llm_dyn))
    668436  CALL conf_dat3d(var, lon_ini, lat_ini, levdyn_ini,                           &
    669                        lon_rad, lat_rad, lev_dyn, var_ana3d, ibar)
     437                       lon_rad, lat_rad, lev_dyn, var_ana3d, .TRUE.)
    670438  DEALLOCATE(lon_ini, lat_ini)
    671439
     
    673441  ALLOCATE(var_tmp3d(iml,jml,llm_dyn))
    674442  DO il = 1,llm_dyn
    675     CALL interp_startvar(var,ibar,il==1,lon_rad,lat_rad,var_ana3d(:,:,il),     &
     443    CALL interp_startvar(var,il==1,lon_rad,lat_rad,var_ana3d(:,:,il),          &
    676444                          lon_in,lat_in,lon_in2,lat_in2,var_tmp3d(:,:,il))
    677445  END DO
     
    708476!-------------------------------------------------------------------------------
    709477!
    710 SUBROUTINE interp_startvar(nam,ibar,ibeg,lon,lat,vari,lon1,lat1,lon2,lat2,varo)
     478SUBROUTINE interp_startvar(nam,ibeg,lon,lat,vari,lon1,lat1,lon2,lat2,varo)
    711479!
    712480!-------------------------------------------------------------------------------
    713481  USE inter_barxy_m, ONLY: inter_barxy
    714   USE grid_atob_m,   ONLY: grille_m
    715482  IMPLICIT NONE
    716483!-------------------------------------------------------------------------------
    717484! Arguments:
    718485  CHARACTER(LEN=*), INTENT(IN)  :: nam
    719   LOGICAL,          INTENT(IN)  :: ibar, ibeg
     486  LOGICAL,          INTENT(IN)  :: ibeg
    720487  REAL,             INTENT(IN)  :: lon(:), lat(:)   ! dim (ii) (jj)
    721488  REAL,             INTENT(IN)  :: vari(:,:)        ! dim (ii,jj)
     
    735502  j2=SIZE(lat2)
    736503  ALLOCATE(vtmp(i1-1,j1))
    737   IF(ibar) THEN
    738     IF(ibeg.AND.prt_level>1) THEN
    739       WRITE(lunout,*)"---------------------------------------------------------"
    740       WRITE(lunout,*)"$$$ Interpolation barycentrique pour "//TRIM(nam)//" $$$"
    741       WRITE(lunout,*)"---------------------------------------------------------"
    742     END IF
    743     CALL inter_barxy(lon, lat(:jj-1), vari, lon2(:i1-1), lat2, vtmp)
    744   ELSE
    745     CALL grille_m   (lon, lat,        vari, lon1,        lat1, vtmp)
    746   END IF
     504  IF(ibeg.AND.prt_level>1) THEN
     505    WRITE(lunout,*)"---------------------------------------------------------"
     506    WRITE(lunout,*)"$$$ Interpolation barycentrique pour "//TRIM(nam)//" $$$"
     507    WRITE(lunout,*)"---------------------------------------------------------"
     508  END IF
     509  CALL inter_barxy(lon, lat(:jj-1), vari, lon2(:i1-1), lat2, vtmp)
    747510  CALL gr_int_dyn(vtmp, varo, i1-1, j1)
    748511
  • LMDZ5/trunk/libf/dynlonlat_phylonlat/phylmd/etat0phys_netcdf.F90

    r2320 r2336  
    3636  USE ioipsl,             ONLY: flininfo, flinopen, flinget, flinclo
    3737  USE assert_eq_m,        ONLY: assert_eq
    38   USE dimphy
     38  USE dimphy,             ONLY: klon
     39  USE conf_dat_m,         ONLY: conf_dat2d
    3940  USE phys_state_var_mod, ONLY: zmea, zstd, zsig, zgam, zthe, zpic, zval, z0m, &
    4041    rlon, solsw, radsol, t_ancien, wake_deltat, wake_s,  rain_fall, qsol, z0h, &
     
    5152  include "paramet.h"
    5253  include "comgeom2.h"
    53   include "comvert.h"
    5454  include "comconst.h"
    5555  include "dimsoil.h"
    5656  include "temps.h"
    57   include "comdissnew.h"
    58   include "serre.h"
    5957  include "clesphys.h"
    6058  REAL, SAVE :: deg2rad
    6159  REAL, SAVE, ALLOCATABLE :: tsol(:)
    62 !  REAL, SAVE, ALLOCATABLE :: rugo(:,:)  ! ??? COMPUTED BUT NOT USED ???
    6360  INTEGER,            SAVE      :: iml_phys, jml_phys, llm_phys, ttm_phys, fid_phys
    6461  REAL, ALLOCATABLE,  SAVE      :: lon_phys(:,:), lat_phys(:,:), levphys_ini(:)
    65   CHARACTER(LEN=256), PARAMETER :: orofname="Relief.nc"
    66   CHARACTER(LEN=256), PARAMETER :: title="RELIEF"
     62  CHARACTER(LEN=256), PARAMETER :: orofname="Relief.nc", orogvar="RELIEF"
     63  CHARACTER(LEN=256), PARAMETER :: phyfname="ECPHY.nc",  psrfvar="SP"
     64  CHARACTER(LEN=256), PARAMETER :: qsolvar="CDSW",       tsrfvar="ST"
    6765
    6866
     
    7270!-------------------------------------------------------------------------------
    7371!
    74 SUBROUTINE etat0phys_netcdf(ib, masque, phis)
     72SUBROUTINE etat0phys_netcdf(masque, phis)
    7573!
    7674!-------------------------------------------------------------------------------
    7775! Purpose: Creates initial states
    7876!-------------------------------------------------------------------------------
    79 ! Note: This routine is designed to work for Earth
     77! Notes:  1) This routine is designed to work for Earth
     78!         2) If masque(:,:)/=-99999., masque and phis are already known.
     79!         Otherwise: compute it.
    8080!-------------------------------------------------------------------------------
    8181  USE control_mod
     
    8484  USE regr_lat_time_climoz_m, ONLY: regr_lat_time_climoz
    8585  USE indice_sol_mod
    86   USE conf_phys_m,    ONLY: conf_phys
    87   USE exner_hyb_m,    ONLY: exner_hyb
    88   USE exner_milieu_m, ONLY: exner_milieu
    89   USE test_disvert_m, ONLY: test_disvert
    90   USE grid_atob_m,    ONLY: grille_m
     86  USE conf_phys_m, ONLY: conf_phys
     87  USE init_ssrf_m, ONLY: start_init_subsurf
    9188  IMPLICIT NONE
    9289!-------------------------------------------------------------------------------
    9390! Arguments:
    94   LOGICAL, INTENT(IN)    :: ib          !--- Barycentric interpolation
    9591  REAL,    INTENT(INOUT) :: masque(:,:) !--- Land mask           dim(iip1,jjp1)
    9692  REAL,    INTENT(INOUT) :: phis  (:,:) !--- Ground geopotential dim(iip1,jjp1)
     
    9995  CHARACTER(LEN=256) :: modname="etat0phys_netcdf", fmt
    10096  INTEGER            :: i, j, l, ji, iml, jml
    101   REAL               :: phystep
     97  LOGICAL            :: read_mask
     98  REAL               :: phystep, dummy
    10299  REAL, DIMENSION(SIZE(masque,1),SIZE(masque,2)) :: masque_tmp
    103100  REAL, DIMENSION(klon)               :: sn, rugmer, run_off_lic_0, fder
    104101  REAL, DIMENSION(klon,nbsrf)         :: qsolsrf, snsrf
    105102  REAL, DIMENSION(klon,nsoilmx,nbsrf) :: tsoil
    106 
    107 !--- Local variables for sea-ice reading:
    108   LOGICAL           :: read_mask
    109   INTEGER           :: iml_lic, jml_lic, isst(klon-2)
    110   INTEGER           :: fid, llm_tmp, ttm_tmp, itaul(1)
    111   REAL, ALLOCATABLE :: dlon_lic(:), lon_lic(:,:), fraclic(:,:)
    112   REAL, ALLOCATABLE :: dlat_lic(:), lat_lic(:,:)
    113   REAL              :: date, lev(1), dummy
    114   REAL              :: flic_tmp(SIZE(masque,1),SIZE(masque,2))
    115103
    116104!--- Arguments for conf_phys
     
    132120  jml=assert_eq(SIZE(masque,2),SIZE(phis,2),TRIM(modname)//" jml")
    133121
    134 ! Grid construction and miscellanous initializations.
     122! Physics configuration
    135123!*******************************************************************************
    136124  CALL conf_phys(  ok_journe, ok_mensuel, ok_instan, ok_hf, ok_LES,     &
     
    145133                   read_climoz,                                         &
    146134                   alp_offset)
    147 
    148135  CALL phys_state_var_init(read_climoz)
    149136
    150   co2_ppm0 = co2_ppm  !--- Initial atmospheric CO2 conc. from .def file
    151 
    152   rlat(1) = pi/2.
    153   DO j=2,jjm; rlat((j-2)*iim+2:(j-1)*iim+1)=rlatu(j);     END DO
    154   rlat(klon) = - pi/2.
    155   rlat(:)=rlat(:)*(180.0/pi)
    156 
    157   rlon(1) = 0.0
    158   DO j=2,jjm; rlon((j-2)*iim+2:(j-1)*iim+1)=rlonv(1:iim); END DO
    159   rlon(klon) = 0.0
    160   rlon(:)=rlon(:)*(180.0/pi)
     137!--- Initial atmospheric CO2 conc. from .def file
     138  co2_ppm0 = co2_ppm
    161139
    162140! Compute ground geopotential, sub-cells quantities and possibly the mask.
     
    174152    WHERE(1.-masque(:,:)<EPSFRA) masque(:,:)=1.
    175153  END IF
    176  CALL gr_dyn_fi(1,iml,jml,klon,masque,zmasq) !--- Land mask to physical grid
     154  CALL gr_dyn_fi(1,iml,jml,klon,masque,zmasq) !--- Land mask to physical grid
    177155
    178156! Compute tsol and qsol on physical grid, knowing phis on 2D grid.
    179157!*******************************************************************************
    180   CALL start_init_phys(rlonv, rlatu, rlonu, rlatv, ib, phis)
     158  CALL start_init_phys(rlonu, rlatv, phis)
    181159
    182160! Some initializations.
     
    188166    CALL regr_lat_time_climoz(read_climoz)
    189167
    190 ! Sub-surfaces initialization
    191 !*******************************************************************************
    192 !--- Read and interpolate on model T-grid soil fraction and soil ice fraction.
    193   CALL flininfo("landiceref.nc", iml_lic, jml_lic, llm_tmp, ttm_tmp, fid)
    194   ALLOCATE( lat_lic(iml_lic,jml_lic),lon_lic(iml_lic, jml_lic))
    195   ALLOCATE(dlat_lic(jml_lic),       dlon_lic(iml_lic))
    196   ALLOCATE( fraclic(iml_lic,jml_lic))
    197   CALL flinopen("landiceref.nc", .FALSE., iml_lic, jml_lic, llm_tmp,  &
    198  &               lon_lic, lat_lic, lev, ttm_tmp, itaul, date, dt, fid)
    199   CALL flinget(fid, 'landice', iml_lic, jml_lic, llm_tmp, ttm_tmp, 1,1, fraclic)
    200   CALL flinclo(fid)
    201   WRITE(lunout,*)'landice dimensions: iml_lic, jml_lic : ',iml_lic,jml_lic
    202   IF(MAXVAL(lon_lic)>pi) lon_lic=lon_lic*pi/180. !--- Conversion to degrees
    203   IF(MAXVAL(lat_lic)>pi) lat_lic=lat_lic*pi/180.
    204   dlon_lic(:)=lon_lic(:,1)
    205   dlat_lic(:)=lat_lic(1,:)
    206   CALL grille_m(dlon_lic, dlat_lic, fraclic, rlonv(1:iim), rlatu, flic_tmp(1:iim,:) )
    207   flic_tmp(iml,:)=flic_tmp(1,:)
    208 
    209 !--- To the physical grid
    210   pctsrf(:,:) = 0.
    211   CALL gr_dyn_fi(1, iml, jml, klon, flic_tmp, pctsrf(:,is_lic))
    212 
    213 !--- Adequation with soil/sea mask
    214   WHERE(pctsrf(:,is_lic)<EPSFRA) pctsrf(:,is_lic)=0.
    215   WHERE(zmasq(:)<EPSFRA)         pctsrf(:,is_lic)=0.
    216   pctsrf(:,is_ter)=zmasq(:)
    217   DO ji=1,klon
    218     IF(zmasq(ji)>EPSFRA) THEN
    219       IF(pctsrf(ji,is_lic)>=zmasq(ji)) THEN
    220         pctsrf(ji,is_lic)=zmasq(ji)
    221         pctsrf(ji,is_ter)=0.
    222       ELSE
    223         pctsrf(ji,is_ter)=zmasq(ji)-pctsrf(ji,is_lic)
    224         IF(pctsrf(ji,is_ter)<EPSFRA) THEN
    225           pctsrf(ji,is_ter)=0.
    226           pctsrf(ji,is_lic)=zmasq(ji)
    227         END IF
    228       END IF
    229     END IF
    230   END DO
    231 
    232 !--- Sub-surface ocean and sea ice (sea ice set to zero for start).
    233   pctsrf(:,is_oce)=(1.-zmasq(:))
    234   WHERE(pctsrf(:,is_oce)<EPSFRA) pctsrf(:,is_oce)=0.
    235   IF(read_mask) pctsrf(:,is_oce)=1-zmasq(:)
    236   isst=0
    237   WHERE(pctsrf(2:klon-1,is_oce)>0.) isst=1
    238 
    239 !--- It is checked that the sub-surfaces sum is equal to 1.
    240   ji=COUNT((ABS(SUM(pctsrf(:,:),dim=2))-1.0)>EPSFRA)
    241   IF(ji/=0) WRITE(lunout,*) 'Sub-cell distribution problem for ',ji,' points'
     168! Sub-surfaces initialization.
     169!*******************************************************************************
     170  CALL start_init_subsurf(read_mask)
    242171
    243172! Write physical initial state
     
    321250!   described in LOTT & MILLER (1997) and LOTT(1999).
    322251!===============================================================================
    323   USE conf_dat_m,  ONLY: conf_dat2d
    324 !  USE grid_atob_m, ONLY: rugsoro
    325252  USE grid_noro_m, ONLY: grid_noro
    326253  IMPLICIT NONE
     
    331258!-------------------------------------------------------------------------------
    332259! Local variables:
    333   CHARACTER(LEN=256) :: modname="start_init_orog"
    334   CHARACTER(LEN=256) :: title="RELIEF"
     260  CHARACTER(LEN=256) :: modname
    335261  INTEGER            :: fid, llm_tmp,ttm_tmp, iml,jml, iml_rel,jml_rel, itau(1)
    336262  REAL               :: lev(1), date, dt
     
    340266  REAL, ALLOCATABLE  :: zgam0(:,:), zthe0(:,:), zpic0(:,:), zval0(:,:)
    341267!-------------------------------------------------------------------------------
     268  modname="start_init_orog"
    342269  iml=assert_eq(SIZE(lon_in),SIZE(phis,1),SIZE(masque,1),TRIM(modname)//" iml")
    343270  jml=assert_eq(SIZE(lat_in),SIZE(phis,2),SIZE(masque,2),TRIM(modname)//" jml")
     
    350277                lev, ttm_tmp, itau, date, dt, fid)
    351278  ALLOCATE(relief_hi(iml_rel,jml_rel))
    352   CALL flinget(fid, title, iml_rel, jml_rel, llm_tmp, ttm_tmp, 1, 1, relief_hi)
     279  CALL flinget(fid, orogvar, iml_rel, jml_rel, llm_tmp, ttm_tmp, 1,1, relief_hi)
    353280  CALL flinclo(fid)
    354281
     
    360287!--- FIELDS ARE PROCESSED TO BE ON STANDARD ANGULAR DOMAINS
    361288  ALLOCATE(lon_rad(iml_rel),lat_rad(jml_rel))
    362   CALL conf_dat2d(title, lon_ini, lat_ini, lon_rad, lat_rad, relief_hi, .FALSE.)
     289  CALL conf_dat2d(orogvar, lon_ini, lat_ini, lon_rad, lat_rad, relief_hi,.FALSE.)
    363290  DEALLOCATE(lon_ini,lat_ini)
    364291
     
    378305  phis = phis * 9.81
    379306  phis(iml,:) = phis(1,:)
    380 
    381 !--- COMPUTE SURFACE ROUGHNESS
    382 !  WRITE(lunout,*)
    383 !  WRITE(lunout,*)'*** Compute surface roughness induced by the orography ***'
    384 !  ALLOCATE(tmp_var(iml-1,jml))
    385 !  CALL rugsoro(lon_rad, lat_rad, relief_hi, lon_in(1:iml-1), lat_in, tmp_var)
    386 !  ALLOCATE(rugo(iml,jml)); rugo(1:iml-1,:)=tmp_var; rugo(iml,:)=tmp_var(1,:)
    387 !  DEALLOCATE(tmp_var)
    388307  DEALLOCATE(relief_hi,lon_rad,lat_rad)
    389308
     
    405324!-------------------------------------------------------------------------------
    406325!
    407 SUBROUTINE start_init_phys(lon_in,lat_in,lon_in2,lat_in2,ibar,phis)
     326SUBROUTINE start_init_phys(lon_in,lat_in,phis)
    408327!
    409328!===============================================================================
     
    413332!-------------------------------------------------------------------------------
    414333! Arguments:
    415   REAL,    INTENT(IN) :: lon_in (:),  lat_in (:)     ! dim (iml) (jml)
    416   REAL,    INTENT(IN) :: lon_in2(:),  lat_in2(:)     ! dim (iml) (jml2)
    417   LOGICAL, INTENT(IN) :: ibar
     334  REAL,    INTENT(IN) :: lon_in(:),  lat_in(:)       ! dim (iml) (jml2)
    418335  REAL,    INTENT(IN) :: phis(:,:)                   ! dim (iml,jml)
    419336!-------------------------------------------------------------------------------
    420337! Local variables:
    421   CHARACTER(LEN=256) :: modname="start_init_phys", physfname="ECPHY.nc"
     338  CHARACTER(LEN=256) :: modname
    422339  REAL               :: date, dt
    423340  INTEGER            :: iml, jml, jml2, itau(1)
     
    426343  REAL, ALLOCATABLE  :: ts(:,:), qs(:,:)
    427344!-------------------------------------------------------------------------------
    428   iml=assert_eq(SIZE(lon_in),SIZE(phis,1),SIZE(lon_in2),TRIM(modname)//" iml")
    429   jml=assert_eq(SIZE(lat_in),SIZE(phis,2),              TRIM(modname)//" jml")
    430   jml2=SIZE(lat_in2)
     345  modname="start_init_phys"
     346  iml=assert_eq(SIZE(lon_in),SIZE(phis,1),TRIM(modname)//" iml")
     347  jml=SIZE(phis,2); jml2=SIZE(lat_in)
    431348
    432349  WRITE(lunout,*)'Opening the surface analysis'
    433   CALL flininfo(physfname, iml_phys, jml_phys, llm_phys, ttm_phys, fid_phys)
    434   WRITE(lunout,*) 'Values read: ',   iml_phys, jml_phys, llm_phys, ttm_phys
     350  CALL flininfo(phyfname, iml_phys, jml_phys, llm_phys, ttm_phys, fid_phys)
     351  WRITE(lunout,*) 'Values read: ',  iml_phys, jml_phys, llm_phys, ttm_phys
    435352
    436353  ALLOCATE(lat_phys(iml_phys,jml_phys),lon_phys(iml_phys,jml_phys))
    437354  ALLOCATE(levphys_ini(llm_phys))
    438   CALL flinopen(physfname, .FALSE., iml_phys, jml_phys, llm_phys,              &
     355  CALL flinopen(phyfname, .FALSE., iml_phys, jml_phys, llm_phys,              &
    439356                lon_phys,lat_phys,levphys_ini,ttm_phys,itau,date,dt,fid_phys)
    440357
     
    445362
    446363  ALLOCATE(var_ana(iml_phys,jml_phys),lon_rad(iml_phys),lat_rad(jml_phys))
    447   CALL get_var_phys('ST'  ,ts)                   !--- SURFACE TEMPERATURE
    448   CALL get_var_phys('CDSW',qs)                   !--- SOIL MOISTURE
     364  CALL get_var_phys(tsrfvar,ts)                   !--- SURFACE TEMPERATURE
     365  CALL get_var_phys(qsolvar,qs)                   !--- SOIL MOISTURE
    449366  CALL flinclo(fid_phys)
    450367  DEALLOCATE(var_ana,lon_rad,lat_rad,lon_ini,lat_ini)
     
    463380!
    464381!-------------------------------------------------------------------------------
    465   USE conf_dat_m, ONLY: conf_dat2d
    466382  IMPLICIT NONE
    467383!-------------------------------------------------------------------------------
     
    474390!-------------------------------------------------------------------------------
    475391  SELECT CASE(title)
    476     CASE('SP');        tllm=0
    477     CASE('ST','CDSW'); tllm=llm_phys
     392    CASE(psrfvar);         tllm=0
     393    CASE(tsrfvar,qsolvar); tllm=llm_phys
    478394  END SELECT
    479395  IF(ALLOCATED(field)) RETURN
    480396  ALLOCATE(field(iml,jml)); field(:,:)=0.
    481397  CALL flinget(fid_phys,title,iml_phys,jml_phys,tllm,ttm_phys,1,1,var_ana)
    482   CALL conf_dat2d(title, lon_ini, lat_ini,  lon_rad, lat_rad, var_ana, ibar)
    483   CALL interp_startvar(title, ibar, .TRUE., lon_rad, lat_rad, var_ana,         &
    484                             lon_in, lat_in, lon_in2, lat_in2, field)
     398  CALL conf_dat2d(title, lon_ini, lat_ini, lon_rad, lat_rad, var_ana, .TRUE.)
     399  CALL interp_startvar(title, .TRUE., lon_rad, lat_rad, var_ana,               &
     400                                      lon_in,  lat_in, field)
    485401
    486402END SUBROUTINE get_var_phys
     
    495411!-------------------------------------------------------------------------------
    496412!
    497 SUBROUTINE interp_startvar(nam,ibar,ibeg,lon,lat,vari,lon1,lat1,lon2,lat2,varo)
     413SUBROUTINE interp_startvar(nam,ibeg,lon,lat,vari,lon2,lat2,varo)
    498414!
    499415!-------------------------------------------------------------------------------
    500416  USE inter_barxy_m, ONLY: inter_barxy
    501   USE grid_atob_m,   ONLY: grille_m
    502417  IMPLICIT NONE
    503418!-------------------------------------------------------------------------------
    504419! Arguments:
    505420  CHARACTER(LEN=*), INTENT(IN)  :: nam
    506   LOGICAL,          INTENT(IN)  :: ibar, ibeg
     421  LOGICAL,          INTENT(IN)  :: ibeg
    507422  REAL,             INTENT(IN)  :: lon(:), lat(:)   ! dim (ii) (jj)
    508423  REAL,             INTENT(IN)  :: vari(:,:)        ! dim (ii,jj)
    509   REAL,             INTENT(IN)  :: lon1(:), lat1(:) ! dim (i1) (j1)
    510424  REAL,             INTENT(IN)  :: lon2(:), lat2(:) ! dim (i1) (j2)
    511425  REAL,             INTENT(OUT) :: varo(:,:)        ! dim (i1) (j1)
    512426!-------------------------------------------------------------------------------
    513427! Local variables:
    514   CHARACTER(LEN=256) :: modname="interp_startvar"
     428  CHARACTER(LEN=256) :: modname
    515429  INTEGER            :: ii, jj, i1, j1, j2
    516430  REAL, ALLOCATABLE  :: vtmp(:,:)
    517431!-------------------------------------------------------------------------------
    518   ii=assert_eq(SIZE(lon),            SIZE(vari,1),TRIM(modname)//" ii")
    519   jj=assert_eq(SIZE(lat),            SIZE(vari,2),TRIM(modname)//" jj")
    520   i1=assert_eq(SIZE(lon1),SIZE(lon2),SIZE(varo,1),TRIM(modname)//" i1")
    521   j1=assert_eq(SIZE(lat1),           SIZE(varo,2),TRIM(modname)//" j1")
    522   j2=SIZE(lat2)
     432  modname="interp_startvar"
     433  ii=assert_eq(SIZE(lon), SIZE(vari,1),TRIM(modname)//" ii")
     434  jj=assert_eq(SIZE(lat), SIZE(vari,2),TRIM(modname)//" jj")
     435  i1=assert_eq(SIZE(lon2),SIZE(varo,1),TRIM(modname)//" i1")
     436  j1=SIZE(varo,2); j2=SIZE(lat2)
    523437  ALLOCATE(vtmp(i1-1,j1))
    524   IF(ibar) THEN
    525     IF(ibeg.AND.prt_level>1) THEN
    526       WRITE(lunout,*)"--------------------------------------------------------"
    527       WRITE(lunout,*)"$$$ Interpolation barycentrique pour "//TRIM(nam)//" $$$"
    528       WRITE(lunout,*)"--------------------------------------------------------"
    529     END IF
    530     CALL inter_barxy(lon, lat(:jj-1), vari, lon2(:i1-1), lat2, vtmp)
    531   ELSE
    532     CALL grille_m   (lon, lat,        vari, lon1,        lat1, vtmp)
     438  IF(ibeg.AND.prt_level>1) THEN
     439    WRITE(lunout,*)"--------------------------------------------------------"
     440    WRITE(lunout,*)"$$$ Interpolation barycentrique pour "//TRIM(nam)//" $$$"
     441    WRITE(lunout,*)"--------------------------------------------------------"
    533442  END IF
     443  CALL inter_barxy(lon, lat(:jj-1), vari, lon2(:i1-1), lat2, vtmp)
    534444  CALL gr_int_dyn(vtmp, varo, i1-1, j1)
    535445
  • LMDZ5/trunk/libf/phylmd/limit_netcdf.F90

    r2315 r2336  
    1 SUBROUTINE limit_netcdf(interbar, extrap, oldice, masque)
    2 !
    3 !-------------------------------------------------------------------------------
     1MODULE limit
     2!
     3!*******************************************************************************
    44! Author : L. Fairhead, 27/01/94
    55!-------------------------------------------------------------------------------
     
    1616!  *    12/2009: D. Cugnet   (f77->f90, calendars, files from coupled runs)
    1717!-------------------------------------------------------------------------------
    18 #ifndef CPP_1D
     18
     19  USE ioipsl,             ONLY: flininfo, flinopen, flinget, flinclo,          &
     20   ioconf_calendar, ioget_calendar, lock_calendar, ioget_mon_len, ioget_year_len
     21  USE assert_eq_m,        ONLY: assert_eq
     22  USE conf_dat_m,         ONLY: conf_dat2d, conf_dat3d
     23  USE dimphy,             ONLY: klon, zmasq
     24  USE phys_state_var_mod, ONLY: pctsrf, rlon, rlat
    1925  USE control_mod
    20   USE indice_sol_mod
    21   USE dimphy
    22   USE ioipsl,             ONLY : ioget_year_len
    23   USE phys_state_var_mod, ONLY : pctsrf, rlon, rlat
    24   USE netcdf,             ONLY : NF90_OPEN,    NF90_CREATE,  NF90_CLOSE,       &
    25                    NF90_DEF_DIM, NF90_DEF_VAR, NF90_PUT_VAR, NF90_PUT_ATT,     &
    26                    NF90_NOERR,   NF90_NOWRITE, NF90_DOUBLE,  NF90_GLOBAL,      &
    27                    NF90_CLOBBER, NF90_ENDDEF,  NF90_UNLIMITED, NF90_FLOAT
    28   USE inter_barxy_m, only: inter_barxy
    29   USE netcdf95,    ONLY: nf95_def_var, nf95_put_att, nf95_put_var
    30   USE grid_atob_m, ONLY: grille_m, rugosite, sea_ice
    31   USE print_control_mod, ONLY: prt_level,lunout
    32   IMPLICIT NONE
    33 !-------------------------------------------------------------------------------
    34 ! Arguments:
    35   include "dimensions.h"
    36   include "paramet.h"
    37   LOGICAL,                    INTENT(IN) :: interbar ! barycentric interpolation
    38   LOGICAL,                    INTENT(IN) :: extrap   ! SST extrapolation flag
    39   LOGICAL,                    INTENT(IN) :: oldice   ! old way ice computation
    40   REAL, DIMENSION(iip1,jjp1), INTENT(IN) :: masque   ! land mask
    41 !-------------------------------------------------------------------------------
    42 ! Local variables:
    43   include "logic.h"
    44   include "comgeom2.h"
    45   include "comconst.h"
    46 
    47 !--- INPUT NETCDF FILES NAMES --------------------------------------------------
    48   CHARACTER(LEN=20) :: icefile, sstfile, dumstr, fnam
     26  USE init_ssrf_m,        ONLY: start_init_subsurf
     27
    4928  CHARACTER(LEN=20), PARAMETER :: &
    5029  fsst(4)=['amipbc_sst_1x1.nc   ','cpl_atm_sst.nc      ','histmth_sst.nc      '&
     
    5635  vsst(4)=['tosbcs    ','SISUTESW  ','tsol_oce  ','sstk      '], &
    5736  vsic(4)=['sicbcs    ','SIICECOV  ','pourc_sic ','ci        ']
    58   CHARACTER(LEN=20), PARAMETER :: frugo='Rugos.nc            ',                &
    59                                   falbe='Albedo.nc           '
    60   CHARACTER(LEN=10), PARAMETER :: vrug='RUGOS     ', valb='ALBEDO    '
     37  CHARACTER(LEN=10), PARAMETER :: &
     38  frugo='Rugos.nc  ', falbe='Albedo.nc ', frelf='Relief.nc ',    &
     39   vrug='RUGOS     ',  valb='ALBEDO    ',  vrel='RELIEF    '
     40
     41CONTAINS
     42
     43!-------------------------------------------------------------------------------
     44!
     45SUBROUTINE limit_netcdf(masque, phis, extrap)
     46!
     47!-------------------------------------------------------------------------------
     48! Author : L. Fairhead, 27/01/94
     49!-------------------------------------------------------------------------------
     50! Purpose: Boundary conditions files building for new model using climatologies.
     51!          Both grids have to be regular.
     52!-------------------------------------------------------------------------------
     53! Note: This routine is designed to work for Earth
     54!-------------------------------------------------------------------------------
     55! Modification history:
     56!  * 23/03/1994: Z. X. Li
     57!  *    09/1999: L. Fairhead (netcdf reading in LMDZ.3.3)
     58!  *    07/2001: P. Le Van
     59!  *    11/2009: L. Guez     (ozone day & night climatos, see etat0_netcdf.F90)
     60!  *    12/2009: D. Cugnet   (f77->f90, calendars, files from coupled runs)
     61!-------------------------------------------------------------------------------
     62#ifndef CPP_1D
     63  USE indice_sol_mod
     64  USE netcdf,             ONLY: NF90_OPEN,    NF90_CREATE,  NF90_CLOSE,        &
     65                  NF90_DEF_DIM, NF90_DEF_VAR, NF90_PUT_VAR, NF90_PUT_ATT,      &
     66                  NF90_NOERR,   NF90_NOWRITE, NF90_DOUBLE,  NF90_GLOBAL,       &
     67                  NF90_CLOBBER, NF90_ENDDEF,  NF90_UNLIMITED, NF90_FLOAT
     68  USE inter_barxy_m,      ONLY: inter_barxy
     69  USE netcdf95,           ONLY: nf95_def_var, nf95_put_att, nf95_put_var
     70  IMPLICIT NONE
     71!-------------------------------------------------------------------------------
     72! Arguments:
     73  include "iniprint.h"
     74  include "dimensions.h"
     75  include "paramet.h"
     76  REAL, DIMENSION(iip1,jjp1), INTENT(INOUT) :: masque ! land mask
     77  REAL, DIMENSION(iip1,jjp1), INTENT(INOUT) :: phis   ! ground geopotential
     78  LOGICAL,                    INTENT(IN)    :: extrap ! SST extrapolation flag
     79!-------------------------------------------------------------------------------
     80! Local variables:
     81  include "logic.h"
     82  include "comgeom2.h"
     83  include "comconst.h"
     84
     85!--- INPUT NETCDF FILES NAMES --------------------------------------------------
     86  CHARACTER(LEN=20) :: icefile, sstfile, dumstr, fnam
    6187  CHARACTER(LEN=10) :: varname
     88
    6289!--- OUTPUT VARIABLES FOR NETCDF FILE ------------------------------------------
    6390  REAL               :: fi_ice(klon), verif(klon)
     
    82109  CALL inigeom
    83110
     111!--- MASK, GROUND GEOPOT. & SUBSURFACES COMPUTATION (IN CASE ok_etat0==.FALSE.)
     112   IF(ALL(masque==-99999.)) THEN
     113    CALL start_init_orog0(rlonv,rlatu,phis,masque)
     114    CALL gr_dyn_fi(1,iip1,jjp1,klon,masque,zmasq)          !--- To physical grid
     115    ALLOCATE(rlon(klon),rlat(klon),pctsrf(klon,nbsrf))
     116    CALL start_init_subsurf(.FALSE.)
     117  END IF
     118
    84119!--- Beware: anneeref (from gcm.def) is used to determine output time sampling
    85120  ndays=ioget_year_len(anneeref)
     
    87122!--- RUGOSITY TREATMENT --------------------------------------------------------
    88123  CALL msg(1,'Traitement de la rugosite')
    89   CALL get_2Dfield(frugo,vrug,'RUG',interbar,ndays,phy_rug,mask=masque(1:iim,:))
     124  CALL get_2Dfield(frugo,vrug,'RUG',ndays,phy_rug,mask=masque(1:iim,:))
    90125
    91126!--- OCEAN TREATMENT -----------------------------------------------------------
     
    108143  CALL msg(-1,'Fichier choisi pour la glace de mer:'//TRIM(icefile))
    109144
    110   CALL get_2Dfield(icefile,varname, 'SIC',interbar,ndays,phy_ice,flag=oldice)
     145  CALL get_2Dfield(icefile,varname, 'SIC',ndays,phy_ice)
    111146
    112147  ALLOCATE(pctsrf_t(klon,nbsrf,ndays))
     
    167202  CALL msg(-1,'Fichier choisi pour la temperature de mer: '//TRIM(sstfile))
    168203
    169   CALL get_2Dfield(sstfile,varname,'SST',interbar,ndays,phy_sst,flag=extrap)
     204  CALL get_2Dfield(sstfile,varname,'SST',ndays,phy_sst,flag=extrap)
    170205
    171206!--- ALBEDO TREATMENT ----------------------------------------------------------
    172207  CALL msg(1,'Traitement de l albedo')
    173   CALL get_2Dfield(falbe,valb,'ALB',interbar,ndays,phy_alb)
     208  CALL get_2Dfield(falbe,valb,'ALB',ndays,phy_alb)
    174209
    175210!--- REFERENCE GROUND HEAT FLUX TREATMENT --------------------------------------
     
    251286!-------------------------------------------------------------------------------
    252287!
    253 SUBROUTINE get_2Dfield(fnam, varname, mode, ibar, ndays, champo, flag, mask)
     288SUBROUTINE get_2Dfield(fnam, varname, mode, ndays, champo, flag, mask)
    254289!
    255290!-----------------------------------------------------------------------------
     
    263298       NF90_CLOSE, NF90_INQ_DIMID, NF90_INQUIRE_DIMENSION, NF90_GET_VAR, &
    264299       NF90_GET_ATT
    265   USE dimphy, ONLY : klon
    266   USE phys_state_var_mod, ONLY : pctsrf
    267   USE conf_dat_m, ONLY: conf_dat2d
    268   USE control_mod
    269300  USE pchsp_95_m, only: pchsp_95
    270301  USE pchfe_95_m, only: pchfe_95
     
    281312  CHARACTER(LEN=10), INTENT(IN)     :: varname  ! NetCDF variable name
    282313  CHARACTER(LEN=3),  INTENT(IN)     :: mode     ! RUG, SIC, SST or ALB
    283   LOGICAL,           INTENT(IN)     :: ibar     ! interp on pressure levels
    284314  INTEGER,           INTENT(IN)     :: ndays    ! current year number of days
    285315  REAL,    POINTER,  DIMENSION(:, :) :: champo  ! output field = f(t)
     
    312342  CHARACTER(LEN=25) :: title              ! for messages
    313343  LOGICAL           :: extrp              ! flag for extrapolation
    314   LOGICAL           :: oldice             ! flag for old way ice computation
    315344  REAL              :: chmin, chmax
    316345  INTEGER ierr
     
    328357  CASE('ALB'); title='Albedo'
    329358  END SELECT
    330  
    331 
    332   extrp=.FALSE.
    333   oldice=.FALSE.
    334   IF ( PRESENT(flag) ) THEN
    335     IF ( flag .AND. mode=='SST' ) extrp=.TRUE.
    336     IF ( flag .AND. mode=='SIC' ) oldice=.TRUE.
    337   END IF
     359  extrp=.FALSE.; IF(PRESENT(flag).AND.mode=='SST') extrp=flag
    338360
    339361!--- GETTING SOME DIMENSIONAL VARIABLES FROM FILE -----------------------------
     
    400422  DO l=1, lmdep
    401423    CALL ncerr(NF90_GET_VAR(ncid,varid,champ,[1,1,l],[imdep,jmdep,1]),fnam)
    402     CALL conf_dat2d(title, dlon_ini, dlat_ini, dlon, dlat, champ, ibar)
     424    CALL conf_dat2d(title, dlon_ini, dlat_ini, dlon, dlat, champ, .TRUE.)
    403425    IF(extrp) CALL extrapol(champ,imdep,jmdep,999999.,.TRUE.,.TRUE.,2,work)
    404 
    405     IF(ibar .AND. .NOT.oldice) THEN
    406       IF(l==1) THEN
     426    IF(l==1) THEN
    407427      CALL msg(5,"----------------------------------------------------------")
    408428      CALL msg(5,"$$$ Interpolation barycentrique pour "//TRIM(title)//" $$$")
    409429      CALL msg(5,"----------------------------------------------------------")
    410       END IF
    411       IF(mode=='RUG') champ=LOG(champ)
    412       CALL inter_barxy(dlon,dlat(:jmdep-1),champ,rlonu(:iim),rlatv,champint)
    413       IF(mode=='RUG') THEN
    414         champint=EXP(champint)
    415         WHERE(NINT(mask)/=1) champint=0.001
    416       END IF
    417     ELSE
    418       SELECT CASE(mode)
    419         CASE('RUG');       CALL rugosite(dlon,dlat,champ,rlonv,rlatu,champint,mask)
    420         CASE('SIC');       CALL sea_ice (dlon,dlat,champ,rlonv,rlatu,champint)
    421         CASE('SST','ALB'); CALL grille_m(dlon,dlat,champ,rlonv,rlatu,champint)
    422       END SELECT
     430    END IF
     431    IF(mode=='RUG') champ=LOG(champ)
     432    CALL inter_barxy(dlon,dlat(:jmdep-1),champ,rlonu(:iim),rlatv,champint)
     433    IF(mode=='RUG') THEN
     434      champint=EXP(champint)
     435      WHERE(NINT(mask)/=1) champint=0.001
    423436    END IF
    424437    champtime(:, :, l)=champint
     
    501514!-------------------------------------------------------------------------------
    502515!
     516SUBROUTINE start_init_orog0(lon_in,lat_in,phis,masque)
     517!
     518!-------------------------------------------------------------------------------
     519  IMPLICIT NONE
     520!===============================================================================
     521! Purpose:  Compute "phis" just like it would be in start_init_orog.
     522!===============================================================================
     523! Arguments:
     524  REAL,             INTENT(IN)    :: lon_in(:), lat_in(:)   ! dim (iml) (jml)
     525  REAL,             INTENT(INOUT) :: phis(:,:), masque(:,:) ! dim (iml,jml)
     526!-------------------------------------------------------------------------------
     527! Local variables:
     528  CHARACTER(LEN=256) :: modname="start_init_orog0"
     529  INTEGER            :: fid, llm_tmp,ttm_tmp, iml,jml, iml_rel,jml_rel, itau(1)
     530  REAL               :: lev(1), date, dt, deg2rad
     531  REAL, ALLOCATABLE  :: lon_rad(:), lon_ini(:), lon_rel(:,:), relief_hi(:,:)
     532  REAL, ALLOCATABLE  :: lat_rad(:), lat_ini(:), lat_rel(:,:)
     533!-------------------------------------------------------------------------------
     534  iml=assert_eq(SIZE(lon_in),SIZE(phis,1),SIZE(masque,1),TRIM(modname)//" iml")
     535  jml=assert_eq(SIZE(lat_in),SIZE(phis,2),SIZE(masque,2),TRIM(modname)//" jml")
     536  IF(iml/=iip1) CALL abort_gcm(TRIM(modname),'iml/=iip1',1)
     537  IF(jml/=jjp1) CALL abort_gcm(TRIM(modname),'jml/=jjp1',1)
     538  pi=2.0*ASIN(1.0); deg2rad=pi/180.0
     539  IF(ANY(phis/=-99999.)) RETURN                  !--- phis ALREADY KNOWN
     540
     541!--- HIGH RESOLUTION OROGRAPHY
     542  CALL flininfo(frelf, iml_rel, jml_rel, llm_tmp, ttm_tmp, fid)
     543
     544  ALLOCATE(lat_rel(iml_rel,jml_rel),lon_rel(iml_rel,jml_rel))
     545  CALL flinopen(frelf, .FALSE., iml_rel, jml_rel, llm_tmp, lon_rel, lat_rel,   &
     546                lev, ttm_tmp, itau, date, dt, fid)
     547  ALLOCATE(relief_hi(iml_rel,jml_rel))
     548  CALL flinget(fid, vrel, iml_rel, jml_rel, llm_tmp, ttm_tmp, 1, 1, relief_hi)
     549  CALL flinclo(fid)
     550
     551!--- IF ANGLES ARE IN DEGREES, THEY ARE CONVERTED INTO RADIANS
     552  ALLOCATE(lon_ini(iml_rel),lat_ini(jml_rel))
     553  lon_ini(:)=lon_rel(:,1); IF(MAXVAL(lon_rel)>pi) lon_ini=lon_ini*deg2rad
     554  lat_ini(:)=lat_rel(1,:); IF(MAXVAL(lat_rel)>pi) lat_ini=lat_ini*deg2rad
     555
     556!--- FIELDS ARE PROCESSED TO BE ON STANDARD ANGULAR DOMAINS
     557  ALLOCATE(lon_rad(iml_rel),lat_rad(jml_rel))
     558  CALL conf_dat2d(vrel, lon_ini, lat_ini, lon_rad, lat_rad, relief_hi, .FALSE.)
     559  DEALLOCATE(lon_ini,lat_ini)
     560
     561!--- COMPUTING SURFACE GEOPOTENTIAL USING ROUTINE grid_noro0
     562  WRITE(lunout,*)
     563  WRITE(lunout,*)'*** Compute surface geopotential ***'
     564
     565!--- CALL OROGRAPHY MODULE (REDUCED VERSION) TO COMPUTE FIELDS
     566  CALL grid_noro0(lon_rad, lat_rad, relief_hi, lon_in, lat_in, phis, masque)
     567  phis = phis * 9.81
     568  phis(iml,:) = phis(1,:)
     569  DEALLOCATE(relief_hi,lon_rad,lat_rad)
     570
     571END SUBROUTINE start_init_orog0
     572!
     573!-------------------------------------------------------------------------------
     574
     575
     576!-------------------------------------------------------------------------------
     577!
     578SUBROUTINE grid_noro0(xd,yd,zd,x,y,zphi,mask)
     579!
     580!===============================================================================
     581! Purpose: Extracted from grid_noro to provide geopotential height for dynamics
     582!          without any call to physics subroutines.
     583!===============================================================================
     584  IMPLICIT NONE
     585!-------------------------------------------------------------------------------
     586! Arguments:
     587  REAL, INTENT(IN)   :: xd(:), yd(:) !--- INPUT  COORDINATES     (imdp) (jmdp)
     588  REAL, INTENT(IN)   :: zd(:,:)      !--- INPUT  FIELD           (imdp,jmdp)
     589  REAL, INTENT(IN)   :: x(:), y(:)   !--- OUTPUT COORDINATES     (imar+1) (jmar)
     590  REAL, INTENT(OUT)  :: zphi(:,:)    !--- GEOPOTENTIAL           (imar+1,jmar)
     591  REAL, INTENT(INOUT):: mask(:,:)    !--- MASK                   (imar+1,jmar)
     592!-------------------------------------------------------------------------------
     593! Local variables:
     594  CHARACTER(LEN=256) :: modname="grid_noro0"
     595  REAL, ALLOCATABLE :: xusn(:), yusn(:)           ! dim (imdp+2*iext) (jmdp+2)
     596  REAL, ALLOCATABLE :: zusn(:,:)                  ! dim (imdp+2*iext,jmdp+2)
     597  REAL, ALLOCATABLE :: weight(:,:)                ! dim (imar+1,jmar)
     598  REAL, ALLOCATABLE :: mask_tmp(:,:), zmea(:,:)   ! dim (imar+1,jmar)
     599  REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imax,jmax)
     600  REAL, ALLOCATABLE :: a(:), b(:)                 ! dim (imax)
     601  REAL, ALLOCATABLE :: c(:), d(:)                 ! dim (jmax)
     602  LOGICAL :: masque_lu
     603  INTEGER :: i, ii, imdp, imar, iext
     604  INTEGER :: j, jj, jmdp, jmar, nn
     605  REAL    :: xpi, zlenx, weighx, xincr,  zbordnor, zmeanor, zweinor, zbordest
     606  REAL    :: rad, zleny, weighy, masque, zbordsud, zmeasud, zweisud, zbordoue
     607!-------------------------------------------------------------------------------
     608  imdp=assert_eq(SIZE(xd),SIZE(zd,1),TRIM(modname)//" imdp")
     609  jmdp=assert_eq(SIZE(yd),SIZE(zd,2),TRIM(modname)//" jmdp")
     610  imar=assert_eq(SIZE(x),SIZE(zphi,1),SIZE(mask,1),TRIM(modname)//" imar")-1
     611  jmar=assert_eq(SIZE(y),SIZE(zphi,2),SIZE(mask,2),TRIM(modname)//" jmar")
     612  IF(imar/=iim)   CALL abort_gcm(TRIM(modname),'imar/=iim'  ,1)
     613  IF(jmar/=jjm+1) CALL abort_gcm(TRIM(modname),'jmar/=jjm+1',1)
     614  iext=imdp/10
     615  xpi = ACOS(-1.)
     616  rad = 6371229.
     617
     618!--- ARE WE USING A READ MASK ?
     619  masque_lu=ANY(mask/=-99999.); IF(.NOT.masque_lu) mask=0.0
     620  WRITE(lunout,*)'Masque lu: ',masque_lu
     621
     622!--- EXTENSION OF THE INPUT DATABASE TO PROCEED COMPUTATIONS AT BOUNDARIES:
     623  ALLOCATE(xusn(imdp+2*iext))
     624  xusn(1     +iext:imdp  +iext)=xd(:)
     625  xusn(1          :       iext)=xd(1+imdp-iext:imdp)-2.*xpi
     626  xusn(1+imdp+iext:imdp+2*iext)=xd(1          :iext)+2.*xpi
     627
     628  ALLOCATE(yusn(jmdp+2))
     629  yusn(1       )=yd(1)   +(yd(1)   -yd(2))
     630  yusn(2:jmdp+1)=yd(:)
     631  yusn(  jmdp+2)=yd(jmdp)+(yd(jmdp)-yd(jmdp-1))
     632
     633  ALLOCATE(zusn(imdp+2*iext,jmdp+2))
     634  zusn(1       +iext:imdp  +iext,2:jmdp+1)=zd  (:                   ,     :)
     635  zusn(1            :       iext,2:jmdp+1)=zd  (imdp-iext+1:imdp    ,     :)
     636  zusn(1+imdp  +iext:imdp+2*iext,2:jmdp+1)=zd  (1:iext              ,     :)
     637  zusn(1            :imdp/2+iext,       1)=zusn(1+imdp/2:imdp  +iext,     2)
     638  zusn(1+imdp/2+iext:imdp+2*iext,       1)=zusn(1       :imdp/2+iext,     2)
     639  zusn(1            :imdp/2+iext,  jmdp+2)=zusn(1+imdp/2:imdp  +iext,jmdp+1)
     640  zusn(1+imdp/2+iext:imdp+2*iext,  jmdp+2)=zusn(1       :imdp/2+iext,jmdp+1)
     641
     642!--- COMPUTE LIMITS OF MODEL GRIDPOINT AREA (REGULAR GRID)
     643  ALLOCATE(a(imar+1),b(imar+1))
     644  b(1:imar)=(x(1:imar  )+ x(2:imar+1))/2.0
     645  b(imar+1)= x(  imar+1)+(x(  imar+1)-x(imar))/2.0
     646  a(1)=x(1)-(x(2)-x(1))/2.0
     647  a(2:imar+1)= b(1:imar)
     648
     649  ALLOCATE(c(jmar),d(jmar))
     650  d(1:jmar-1)=(y(1:jmar-1)+ y(2:jmar))/2.0
     651  d(  jmar  )= y(  jmar  )+(y(  jmar)-y(jmar-1))/2.0
     652  c(1)=y(1)-(y(2)-y(1))/2.0
     653  c(2:jmar)=d(1:jmar-1)
     654
     655!--- INITIALIZATIONS:
     656  ALLOCATE(weight(imar+1,jmar)); weight(:,:)= 0.0
     657  ALLOCATE(zmea  (imar+1,jmar)); zmea  (:,:)= 0.0
     658
     659!--- SUMMATION OVER GRIDPOINT AREA
     660  zleny=xpi/REAL(jmdp)*rad
     661  xincr=xpi/REAL(jmdp)/2.
     662  ALLOCATE(num_tot(imar+1,jmar)); num_tot(:,:)=0.
     663  ALLOCATE(num_lan(imar+1,jmar)); num_lan(:,:)=0.
     664  DO ii = 1, imar+1
     665    DO jj = 1, jmar
     666      DO j = 2,jmdp+1
     667        zlenx  =zleny  *COS(yusn(j))
     668        zbordnor=(xincr+c(jj)-yusn(j))*rad
     669        zbordsud=(xincr-d(jj)+yusn(j))*rad
     670        weighy=AMAX1(0.,AMIN1(zbordnor,zbordsud,zleny))
     671        IF(weighy/=0) THEN
     672          DO i = 2, imdp+2*iext-1
     673            zbordest=(xusn(i)-a(ii)+xincr)*rad*COS(yusn(j))
     674            zbordoue=(b(ii)+xincr-xusn(i))*rad*COS(yusn(j))
     675            weighx=AMAX1(0.,AMIN1(zbordest,zbordoue,zlenx))
     676            IF(weighx/=0)THEN
     677              num_tot(ii,jj)=num_tot(ii,jj)+1.0
     678              IF(zusn(i,j)>=1.)num_lan(ii,jj)=num_lan(ii,jj)+1.0
     679              weight(ii,jj)=weight(ii,jj)+weighx*weighy
     680              zmea  (ii,jj)=zmea  (ii,jj)+zusn(i,j)*weighx*weighy !--- MEAN
     681            END IF
     682          END DO
     683        END IF
     684      END DO
     685    END DO
     686  END DO
     687
     688!--- COMPUTE PARAMETERS NEEDED BY LOTT & MILLER (1997) AND LOTT (1999) SSO SCHEME
     689  IF(.NOT.masque_lu) THEN
     690    WHERE(weight(:,1:jmar-1)/=0.0) mask=num_lan(:,:)/num_tot(:,:)
     691  END IF
     692  nn=COUNT(weight(:,1:jmar-1)==0.0)
     693  IF(nn/=0) WRITE(lunout,*)'Problem with weight ; vanishing occurrences: ',nn
     694  WHERE(weight/=0.0) zmea(:,:)=zmea(:,:)/weight(:,:)
     695
     696!--- MASK BASED ON GROUND MAXIMUM, 10% THRESHOLD (<10%: SURF PARAMS MEANINGLESS)
     697  ALLOCATE(mask_tmp(imar+1,jmar)); mask_tmp(:,:)=0.0
     698  WHERE(mask>=0.1) mask_tmp = 1.
     699  WHERE(weight(:,:)/=0.0)
     700    zphi(:,:)=mask_tmp(:,:)*zmea(:,:)
     701    zmea(:,:)=mask_tmp(:,:)*zmea(:,:)
     702  END WHERE
     703  WRITE(lunout,*)'  MEAN ORO:' ,MAXVAL(zmea)
     704
     705!--- Values at poles
     706  zphi(imar+1,:)=zphi(1,:)
     707
     708  zweinor=SUM(weight(1:imar,   1),DIM=1)
     709  zweisud=SUM(weight(1:imar,jmar),DIM=1)
     710  zmeanor=SUM(weight(1:imar,   1)*zmea(1:imar,   1),DIM=1)
     711  zmeasud=SUM(weight(1:imar,jmar)*zmea(1:imar,jmar),DIM=1)
     712  zphi(:,1)=zmeanor/zweinor; zphi(:,jmar)=zmeasud/zweisud
     713
     714END SUBROUTINE grid_noro0
     715!
     716!-------------------------------------------------------------------------------
     717
     718
     719!-------------------------------------------------------------------------------
     720!
    503721FUNCTION year_len(y,cal_in)
    504722!
    505723!-------------------------------------------------------------------------------
    506   USE ioipsl, ONLY : ioget_calendar,ioconf_calendar,lock_calendar,ioget_year_len
    507724  IMPLICIT NONE
    508725!-------------------------------------------------------------------------------
     
    537754!
    538755!-------------------------------------------------------------------------------
    539   USE ioipsl, ONLY : ioget_calendar,ioconf_calendar,lock_calendar,ioget_mon_len
    540756  IMPLICIT NONE
    541757!-------------------------------------------------------------------------------
     
    624840!-------------------------------------------------------------------------------
    625841  USE netcdf, ONLY : NF90_NOERR, NF90_STRERROR
    626   USE print_control_mod, ONLY: lunout
    627842  IMPLICIT NONE
    628843!-------------------------------------------------------------------------------
     
    643858! of #ifndef CPP_1D
    644859END SUBROUTINE limit_netcdf
     860
     861END MODULE limit
     862!
     863!*******************************************************************************
  • LMDZ5/trunk/makelmdz_fcm

    r2326 r2336  
    184184done
    185185
    186 if [[ $code = ce0l && $paramem = mem ]]
    187 then
    188     echo "There is no parallel version of ce0l at the moment."
    189     echo "Please compile the sequential version of the code to produce the" \
    190         "executable ce0l."
    191     exit 1
    192 fi
    193 
    194186###############################################################
    195187# path to fcm
Note: See TracChangeset for help on using the changeset viewer.