14 SUBROUTINE grid_noro(xd,yd,zd,x,y,zphi,zmea,zstd,zsig,zgam,zthe,zpic,zval,mask)
 
   50   REAL, 
PARAMETER :: epsfra = 1.e-5
 
   53   REAL, 
INTENT(IN)  :: xd(:), yd(:)  
 
   54   REAL, 
INTENT(IN)  :: zd(:,:)       
 
   55   REAL, 
INTENT(IN)  :: x(:), y(:)    
 
   56   REAL, 
INTENT(OUT) :: zphi(:,:)     
 
   57   REAL, 
INTENT(OUT) :: zmea(:,:)     
 
   58   REAL, 
INTENT(OUT) :: zstd(:,:)     
 
   59   REAL, 
INTENT(OUT) :: zsig(:,:)     
 
   60   REAL, 
INTENT(OUT) :: zgam(:,:)     
 
   61   REAL, 
INTENT(OUT) :: zthe(:,:)     
 
   62   REAL, 
INTENT(OUT) :: zpic(:,:)     
 
   63   REAL, 
INTENT(OUT) :: zval(:,:)     
 
   64   REAL, 
INTENT(OUT) :: mask(:,:)     
 
   67   CHARACTER(LEN=256) :: modname=
"grid_noro" 
   68   REAL, 
ALLOCATABLE :: xusn(:), yusn(:)           
 
   69   REAL, 
ALLOCATABLE :: zusn(:,:)                  
 
   71   REAL, 
ALLOCATABLE :: ztz(:,:), zxtzx(:,:), zytzy(:,:), zxtzy(:,:), weight(:,:)
 
   73   REAL, 
ALLOCATABLE :: zxtzxusn(:,:), zytzyusn(:,:), zxtzyusn(:,:)
 
   74   REAL, 
ALLOCATABLE :: mask_tmp(:,:), zmea0(:,:)  
 
   75   REAL, 
ALLOCATABLE :: num_tot(:,:), num_lan(:,:) 
 
   76   REAL, 
ALLOCATABLE :: a(:), b(:)                 
 
   77   REAL, 
ALLOCATABLE :: c(:), d(:)                 
 
   79   INTEGER :: i, ii, imdp, imar, iext
 
   80   INTEGER :: j, jj, jmdp, jmar, nn
 
   81   REAL    :: xpi, zdeltax, zlenx, weighx, xincr,  zmeanor0
 
   82   REAL    :: rad, zdeltay, zleny, weighy, masque, zmeasud0
 
   83   REAL    :: zbordnor, zmeanor, zstdnor, zsignor, zweinor, zpicnor, zvalnor
 
   84   REAL    :: zbordsud, zmeasud, zstdsud, zsigsud, zweisud, zpicsud, zvalsud
 
   85   REAL    :: zbordest, zbordoue, xk, xl, xm, xp, xq, xw
 
   87   imdp=
assert_eq(
SIZE(xd),
SIZE(zd,1),trim(modname)//
" imdp")
 
   88   jmdp=
assert_eq(
SIZE(yd),
SIZE(zd,2),trim(modname)//
" jmdp")
 
   89   imar=
assert_eq([
SIZE(x),
SIZE(zphi,1),
SIZE(zmea,1),
SIZE(zstd,1),
SIZE(zsig,1), &
 
   90                           SIZE(zgam,1),
SIZE(zthe,1),
SIZE(zpic,1),
SIZE(zval,1), &
 
   91                           SIZE(mask,1)],trim(modname)//
" imar")-1
 
   92   jmar=
assert_eq([
SIZE(y),
SIZE(zphi,2),
SIZE(zmea,2),
SIZE(zstd,2),
SIZE(zsig,2), &
 
   93                           SIZE(zgam,2),
SIZE(zthe,2),
SIZE(zpic,2),
SIZE(zval,2), &
 
   94                           SIZE(mask,2)],trim(modname)//
" jmar")
 
  100   zdeltay=2.*xpi/
REAL(jmdp)*rad
 
  101   WRITE(
lunout,*)
"*** Orography parameters at sub-cell scale ***" 
  104   masque_lu=any(mask/=-99999.); 
IF(.NOT.masque_lu) mask=0.0
 
  105   WRITE(
lunout,*)
'Masque lu: ',masque_lu
 
  108   ALLOCATE(xusn(imdp+2*iext))
 
  109   xusn(1     +iext:imdp  +iext)=xd(:)
 
  110   xusn(1          :       iext)=xd(1+imdp-iext:imdp)-2.*xpi
 
  111   xusn(1+imdp+iext:imdp+2*iext)=xd(1          :iext)+2.*xpi
 
  113   ALLOCATE(yusn(jmdp+2))
 
  114   yusn(1       )=yd(1)   +(yd(1)   -yd(2))
 
  116   yusn(  jmdp+2)=yd(jmdp)+(yd(jmdp)-yd(jmdp-1))
 
  118   ALLOCATE(zusn(imdp+2*iext,jmdp+2))
 
  119   zusn(1       +iext:imdp  +iext,2:jmdp+1)=zd(:                   ,     :)
 
  120   zusn(1            :       iext,2:jmdp+1)=zd(imdp-iext+1:imdp    ,     :)
 
  121   zusn(1+imdp  +iext:imdp+2*iext,2:jmdp+1)=zd(1:iext              ,     :)
 
  122   zusn(1            :imdp/2+iext,       1)=zusn(1+imdp/2:imdp  +iext,     2)
 
  123   zusn(1+imdp/2+iext:imdp+2*iext,       1)=zusn(1       :imdp/2+iext,     2)
 
  124   zusn(1            :imdp/2+iext,  jmdp+2)=zusn(1+imdp/2:imdp  +iext,jmdp+1)
 
  125   zusn(1+imdp/2+iext:imdp+2*iext,  jmdp+2)=zusn(1       :imdp/2+iext,jmdp+1)
 
  128   ALLOCATE(a(imar+1),b(imar+1))
 
  129   b(1:imar)=(x(1:imar  )+ x(2:imar+1))/2.0
 
  130   b(imar+1)= x(  imar+1)+(x(  imar+1)-x(imar))/2.0
 
  131   a(1)=x(1)-(x(2)-x(1))/2.0
 
  132   a(2:imar+1)= b(1:imar)
 
  134   ALLOCATE(c(jmar),d(jmar))
 
  135   d(1:jmar-1)=(y(1:jmar-1)+ y(2:jmar))/2.0
 
  136   d(  jmar  )= y(  jmar  )+(y(  jmar)-y(jmar-1))/2.0
 
  137   c(1)=y(1)-(y(2)-y(1))/2.0
 
  138   c(2:jmar)=d(1:jmar-1)
 
  141   ALLOCATE(weight(imar+1,jmar)); weight(:,:)= 0.0
 
  142   ALLOCATE(zxtzx(imar+1,jmar)); zxtzx(:,:)= 0.0
 
  143   ALLOCATE(zytzy(imar+1,jmar)); zytzy(:,:)= 0.0
 
  144   ALLOCATE(zxtzy(imar+1,jmar)); zxtzy(:,:)= 0.0
 
  145   ALLOCATE(ztz(imar+1,jmar)); ztz(:,:)= 0.0
 
  152   ALLOCATE(zytzyusn(imdp+2*iext,jmdp+2)); zytzyusn(:,:)=0.0
 
  153   ALLOCATE(zxtzxusn(imdp+2*iext,jmdp+2)); zxtzxusn(:,:)=0.0
 
  154   ALLOCATE(zxtzyusn(imdp+2*iext,jmdp+2)); zxtzyusn(:,:)=0.0
 
  156     zdeltax=zdeltay*cos(yusn(j))
 
  157     DO i = 2, imdp+2*iext-1
 
  158       zytzyusn(i,j)=(zusn(i,j+1)-zusn(i,j-1))**2/zdeltay**2
 
  159       zxtzxusn(i,j)=(zusn(i+1,j)-zusn(i-1,j))**2/zdeltax**2
 
  160       zxtzyusn(i,j)=(zusn(i,j+1)-zusn(i,j-1))   /zdeltay  &
 
  161      &             *(zusn(i+1,j)-zusn(i-1,j))   /zdeltax
 
  166   zleny=xpi/
REAL(jmdp)*rad
 
  167   xincr=xpi/
REAL(jmdp)/2.
 
  168   ALLOCATE(num_tot(imar+1,jmar)); num_tot(:,:)=0.
 
  169   ALLOCATE(num_lan(imar+1,jmar)); num_lan(:,:)=0.
 
  173         zlenx  =zleny  *cos(yusn(j))
 
  174         zdeltax=zdeltay*cos(yusn(j))
 
  175         zbordnor=(xincr+c(jj)-yusn(j))*rad
 
  176         zbordsud=(xincr-d(jj)+yusn(j))*rad
 
  177         weighy=amax1(0.,amin1(zbordnor,zbordsud,zleny))
 
  179         DO i = 2, imdp+2*iext-1
 
  180           zbordest=(xusn(i)-a(ii)+xincr)*rad*cos(yusn(j))
 
  181           zbordoue=(b(ii)+xincr-xusn(i))*rad*cos(yusn(j))
 
  182           weighx=amax1(0.,amin1(zbordest,zbordoue,zlenx))
 
  184           num_tot(ii,jj)=num_tot(ii,jj)+1.0
 
  185           IF(zusn(i,j)>=1.)num_lan(ii,jj)=num_lan(ii,jj)+1.0
 
  186           weight(ii,jj)=weight(ii,jj)+weighx*weighy
 
  187           zxtzx(ii,jj)=zxtzx(ii,jj)+zxtzxusn(i,j)*weighx*weighy
 
  188           zytzy(ii,jj)=zytzy(ii,jj)+zytzyusn(i,j)*weighx*weighy
 
  189           zxtzy(ii,jj)=zxtzy(ii,jj)+zxtzyusn(i,j)*weighx*weighy
 
  190           ztz(ii,jj)=  ztz(ii,jj)+zusn(i,j)*zusn(i,j)*weighx*weighy
 
  191           zmea(ii,jj)= zmea(ii,jj)+zusn(i,j)*weighx*weighy 
 
  192           zpic(ii,jj)=amax1(zpic(ii,jj),zusn(i,j))         
 
  193           zval(ii,jj)=amin1(zval(ii,jj),zusn(i,j))         
 
  200   IF(.NOT.masque_lu) 
THEN 
  201     WHERE(weight(:,1:jmar-1)/=0.0) mask=num_lan(:,:)/num_tot(:,:)
 
  203   nn=count(weight(:,1:jmar-1)==0.0)
 
  204   IF(nn/=0) 
WRITE(
lunout,*)
'Problem with weight ; vanishing occurrences: ',nn
 
  205   WHERE(weight(:,:)/=0.0)
 
  206     zmea(:,:)=zmea(:,:)/weight(:,:)
 
  207     zxtzx(:,:)=zxtzx(:,:)/weight(:,:)
 
  208     zytzy(:,:)=zytzy(:,:)/weight(:,:)
 
  209     zxtzy(:,:)=zxtzy(:,:)/weight(:,:)
 
  210     ztz(:,:)=ztz(:,:)/weight(:,:)
 
  211     zstd(:,:)=ztz(:,:)-zmea(:,:)**2
 
  213   WHERE(zstd(:,:)<0) zstd(:,:)=0.
 
  214   zstd(:,:)=sqrt(zstd(:,:))
 
  217   zxtzx(:,   1)=zxtzx(:,     2)
 
  218   zxtzx(:,jmar)=zxtzx(:,jmar-1)
 
  219   zxtzy(:,   1)=zxtzy(:,     2)
 
  220   zxtzy(:,jmar)=zxtzy(:,jmar-1)
 
  221   zytzy(:,   1)=zytzy(:,     2)
 
  222   zytzy(:,jmar)=zytzy(:,jmar-1)
 
  227   ALLOCATE(zmea0(imar+1,jmar))
 
  233   ALLOCATE(mask_tmp(imar+1,jmar)); mask_tmp(:,:)=0.0
 
  234   WHERE(mask>=0.1) mask_tmp = 1.
 
  235   WHERE(weight(:,:)/=0.0)
 
  237     zphi(:,:)= mask_tmp(:,:)*zmea0(:,:)
 
  238     zmea0(:,:)= mask_tmp(:,:)*zmea0(:,:)
 
  239     zmea(:,:)= mask_tmp(:,:)*zmea(:,:)
 
  240     zpic(:,:)= mask_tmp(:,:)*zpic(:,:)
 
  241     zval(:,:)= mask_tmp(:,:)*zval(:,:)
 
  242     zstd(:,:)= mask_tmp(:,:)*zstd(:,:)
 
  246       IF (weight(ii,jj)/=0.0) 
THEN 
  248         xk=(zxtzx(ii,jj)+zytzy(ii,jj))/2.
 
  249         xl=(zxtzx(ii,jj)-zytzy(ii,jj))/2.
 
  251         xp=xk-sqrt(xl**2+xm**2)
 
  252         xq=xk+sqrt(xl**2+xm**2)
 
  256         IF(abs(xm)<=xw) xm=xw*sign(1.,xm)
 
  258         zsig(ii,jj)=sqrt(xq)*mask_tmp(ii,jj)
 
  260         zgam(ii,jj)=xp/xq*mask_tmp(ii,jj)
 
  262         zthe(ii,jj)=57.29577951*atan2(xm,xl)/2.*mask_tmp(ii,jj)
 
  266   WRITE(
lunout,*)
'  MEAN ORO:' ,maxval(zmea)
 
  267   WRITE(
lunout,*)
'  ST. DEV.:' ,maxval(zstd)
 
  268   WRITE(
lunout,*)
'  PENTE:'    ,maxval(zsig)
 
  269   WRITE(
lunout,*)
'  ANISOTROP:',maxval(zgam)
 
  270   WRITE(
lunout,*)
'  ANGLE:'    ,minval(zthe),maxval(zthe)
 
  271   WRITE(
lunout,*)
'  pic:'      ,maxval(zpic)
 
  272   WRITE(
lunout,*)
'  val:'      ,maxval(zval)
 
  275   zmea0(imar+1,:)=zmea0(1,:)
 
  276   zmea(imar+1,:)=zmea(1,:)
 
  277   zphi(imar+1,:)=zphi(1,:)
 
  278   zpic(imar+1,:)=zpic(1,:)
 
  279   zval(imar+1,:)=zval(1,:)
 
  280   zstd(imar+1,:)=zstd(1,:)
 
  281   zsig(imar+1,:)=zsig(1,:)
 
  282   zgam(imar+1,:)=zgam(1,:)
 
  283   zthe(imar+1,:)=zthe(1,:)
 
  285   zweinor =sum(weight(1:imar,   1),dim=1)
 
  286   zweisud =sum(weight(1:imar,jmar),dim=1)
 
  287   zmeanor0=sum(weight(1:imar,   1)*zmea0(1:imar,   1),dim=1)
 
  288   zmeasud0=sum(weight(1:imar,jmar)*zmea0(1:imar,jmar),dim=1)
 
  289   zmeanor =sum(weight(1:imar,   1)*zmea(1:imar,   1),dim=1)
 
  290   zmeasud =sum(weight(1:imar,jmar)*zmea(1:imar,jmar),dim=1)
 
  291   zstdnor =sum(weight(1:imar,   1)*zstd(1:imar,   1),dim=1)
 
  292   zstdsud =sum(weight(1:imar,jmar)*zstd(1:imar,jmar),dim=1)
 
  293   zsignor =sum(weight(1:imar,   1)*zsig(1:imar,   1),dim=1)
 
  294   zsigsud =sum(weight(1:imar,jmar)*zsig(1:imar,jmar),dim=1)
 
  295   zpicnor =sum(weight(1:imar,   1)*zpic(1:imar,   1),dim=1)
 
  296   zpicsud =sum(weight(1:imar,jmar)*zpic(1:imar,jmar),dim=1)
 
  297   zvalnor =sum(weight(1:imar,   1)*zval(1:imar,   1),dim=1)
 
  298   zvalsud =sum(weight(1:imar,jmar)*zval(1:imar,jmar),dim=1)
 
  300   zmea(:,1)=zmeanor /zweinor; zmea(:,jmar)=zmeasud /zweisud
 
  302   zphi(:,1)=zmeanor /zweinor; zphi(:,jmar)=zmeasud /zweisud
 
  303   zpic(:,1)=zpicnor /zweinor; zpic(:,jmar)=zpicsud /zweisud
 
  304   zval(:,1)=zvalnor /zweinor; zval(:,jmar)=zvalsud /zweisud
 
  305   zstd(:,1)=zstdnor /zweinor; zstd(:,jmar)=zstdsud /zweisud
 
  306   zsig(:,1)=zsignor /zweinor; zsig(:,jmar)=zsigsud /zweisud
 
  307   zgam(:,1)=1.;               zgam(:,jmar)=1.
 
  308   zthe(:,1)=0.;               zthe(:,jmar)=0.
 
  324   REAL, 
INTENT(INOUT) :: x(:,:)
 
  327   REAL    :: xf(size(x,dim=1),size(x,dim=2)), weightpb(-1:1,-1:1)
 
  328   INTEGER :: 
i, j, imar, jmar
 
  330   weightpb=reshape([((1./
REAL((1+i**2)*(1+j**2)),i=-1,1),j=-1,1)],shape=[3,3])
 
  331   weightpb=weightpb/sum(weightpb)
 
  332   imar=
SIZE(x,dim=1); jmar=
SIZE(x,dim=2)
 
  335       xf(i,j)=sum(x(i-1:i+1,j-1:j+1)*weightpb(:,:))
 
  339     xf(1,j)=sum(x(imar-1,j-1:j+1)*weightpb(-1,:))
 
  340     xf(1,j)=xf(1,j)+sum(x(1:2,j-1:j+1)*weightpb(0:1,-1:1))
 
  344   xf(:,jmar)=xf(:,jmar-1)
 
subroutine, public grid_noro(xd, yd, zd, x, y, zphi, zmea, zstd, zsig, zgam, zthe, zpic, zval, mask)
 
!$Id klon initialisation mois suivants day_rain itap ENDIF!Calcul fin de nday_rain calcul nday_rain itap DO i
 
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout