16 SUBROUTINE fine2coarse(x_i, y_i, x_o, y_o, d_o1, d_i, msk, d_o2)
22 REAL,
INTENT(IN) :: x_i(:), y_i(:)
23 REAL,
INTENT(IN) :: x_o(:), y_o(:)
24 REAL,
INTENT(OUT) :: d_o1(:,:)
25 REAL,
OPTIONAL,
INTENT(IN) :: d_i (:,:)
26 LOGICAL,
OPTIONAL,
INTENT(IN) :: msk (:,:)
27 REAL,
OPTIONAL,
INTENT(OUT) :: d_o2(:,:)
30 CHARACTER(LEN=256) :: modname=
"fine2coarse"
31 INTEGER :: mi, ni, ii, ji, mo, no, io, jo, nr(2), m1, n1, m2, n2, mx, my, nn
34 INTEGER,
DIMENSION(SIZE(x_o),SIZE(y_o)) :: num_tot
35 LOGICAL,
DIMENSION(SIZE(x_o),SIZE(y_o)) :: found, mask
36 REAL,
DIMENSION(SIZE(x_o),SIZE(y_o)) :: dist
37 REAL,
DIMENSION(SIZE(x_o)) :: a, b
38 REAL,
DIMENSION(SIZE(y_o)) :: c, d
39 REAL,
PARAMETER :: thresh=1.e-5
41 mi=
SIZE(x_i); ni=
SIZE(y_i); mo=
SIZE(x_o); no=
SIZE(y_o)
42 m1=m1; m2=mo; mx=mo;
IF(
PRESENT(msk)) mx=
SIZE(msk,1)
43 n1=ni; n2=no; my=no;
IF(
PRESENT(msk)) my=
SIZE(msk,2)
44 li=
PRESENT(d_i );
IF(li) then; m1=
SIZE(d_i ,1); n1=
SIZE(d_i ,2);
END IF
45 lo=
PRESENT(d_o2);
IF(lo) then; m2=
SIZE(d_o2,1); n2=
SIZE(d_o2,2);
END IF
48 mo=
assert_eq(mo,m2,mx,
SIZE(d_o1,1),trim(modname)//
" mo")
49 no=
assert_eq(no,n2,my,
SIZE(d_o1,2),trim(modname)//
" no")
50 mask(:,:)=.
true.;
IF(
PRESENT(msk)) mask(:,:)=msk(:,:)
53 b(mo)=x_o(mo)+(x_o(mo)-x_o(mo-1))/2.0; b(1:mo-1)=(x_o(1:mo-1)+x_o(2:mo))/2.0
54 d(no)=y_o(no)+(y_o(no)-y_o(no-1))/2.0; d(1:no-1)=(y_o(1:no-1)+y_o(2:no))/2.0
55 a(1 )=x_o(1 )-(x_o(2 )-x_o(1 ))/2.0; a(2:mo )= b(1:mo-1)
56 c(1 )=y_o(1 )-(y_o(2 )-y_o(1 ))/2.0; c(2:no )= d(1:no-1)
59 d_o1(:,:)=0.; num_tot(:,:)=0; inc=1.0
65 IF((y_i(ji)-c(jo)<thresh.OR.y_i(ji)-d(jo)>thresh).AND. &
66 (y_i(ji)-c(jo)>thresh.OR.y_i(ji)-d(jo)<thresh)) cycle
68 IF((x_i(ii)-a(io)<thresh.OR.x_i(ii)-b(io)>thresh).AND. &
69 (x_i(ii)-a(io)>thresh.OR.x_i(ii)-b(io)<thresh)) cycle
70 num_tot(io,jo)=num_tot(io,jo)+1
71 IF(mask(io,jo)) d_o1(io,jo)=d_o1(io,jo)+inc
73 IF(mask(io,jo)) d_o2(io,jo)=d_o2(io,jo)+inc*inc
80 found(:,:)=num_tot(:,:)/=0
81 WHERE(found.AND.mask) d_o1(:,:)=d_o1(:,:)/
REAL(num_tot(:,:))
82 IF(
PRESENT(d_o2))
THEN
83 WHERE(found.AND.mask) d_o2(:,:)=d_o2(:,:)/
REAL(num_tot(:,:))
86 nn=count(found);
IF(nn==0)
RETURN
91 IF(found(io,jo)) cycle
93 CALL dist_sphe(x_o(io),y_o(jo),x_i,y_i,dist(:,:))
95 inc=1.0;
IF(li) inc=d_i(nr(1),nr(2))
96 IF(mask(io,jo)) d_o1(io,jo)=inc
107 SUBROUTINE grille_m(xdata, ydata, entree, x, y, sortie)
131 REAL,
INTENT(IN) :: xdata(:), ydata(:)
132 REAL,
INTENT(IN) :: entree(size(xdata),size(ydata))
133 REAL,
INTENT(IN) :: x(:), y(:)
134 REAL,
INTENT(OUT) :: sortie(size(x),size(y))
145 SUBROUTINE rugosite(xdata, ydata, entree, x, y, sortie, mask)
156 REAL,
INTENT(IN) :: xdata(:), ydata(:)
157 REAL,
INTENT(IN) :: entree(size(xdata),size(ydata))
158 REAL,
INTENT(IN) :: x(:), y(:)
159 REAL,
INTENT(OUT) :: sortie(size(x),size(y))
160 REAL,
INTENT(IN) :: mask (size(x),size(y))
162 CALL fine2coarse(xdata,ydata,x,y,sortie,log(entree))
164 sortie(:,:)=exp(sortie(:,:))
176 SUBROUTINE sea_ice(xdata, ydata, glace01, x, y, frac_ice)
187 REAL,
INTENT(IN) :: xdata(:), ydata(:)
188 REAL,
INTENT(IN) :: glace01(:,:)
189 REAL,
INTENT(IN) :: x(:), y(:)
190 REAL,
INTENT(OUT) :: frac_ice(size(x),size(y))
192 CALL fine2coarse(xdata,ydata,x,y,frac_ice,msk=nint(glace01)==1)
201 SUBROUTINE rugsoro(xrel, yrel, relief, xmod, ymod, rugs)
210 REAL,
INTENT(IN) :: xrel(:), yrel(:)
211 REAL,
INTENT(IN) :: relief(:,:)
212 REAL,
INTENT(IN) :: xmod(:), ymod(:)
213 REAL,
INTENT(OUT) :: rugs(size(xmod),size(ymod))
217 INTEGER,
PARAMETER:: itmp=360, jtmp=180
218 REAL :: out(size(xmod),size(xmod)), amin, amax
219 REAL :: cham1tmp(itmp,jtmp), cham2tmp(itmp,jtmp), xtmp(itmp), ytmp(jtmp)
223 xtmp(:)=4.0*atan(1.0)*[(-1.0+
REAL(2*k-1)/
REAL(itmp),k=1,itmp)]
224 ytmp(:)=2.0*atan(1.0)*[(-1.0+
REAL(2*k-1)/
REAL(jtmp),k=1,jtmp)]
225 CALL fine2coarse(xrel,yrel,xtmp,ytmp,cham1tmp,relief,d_o2=cham2tmp)
226 cham2tmp(:,:)=cham2tmp(:,:)-cham1tmp(:,:)**2
227 nn=count(cham2tmp<=-7.5)
229 print*,
'Problem for rugsoro ; std**2 < -7.5 for several points: ',nn
233 IF(nn/=0) print*,
'Problem for rugsoro ; std**2 < 0. for several points: ',nn
234 WHERE(cham2tmp<0.0) cham2tmp=0.0
235 cham2tmp(:,:)=sqrt(cham2tmp(:,:))
236 amin=minval(cham2tmp); amax=maxval(cham2tmp)
237 print*,
'Ecart-type 1x1:', amin, amax
240 WHERE(cham2tmp<0.001) cham2tmp=0.001
241 CALL fine2coarse(xtmp,ytmp,xmod,ymod,out,
REAL(log(cham2tmp)))
243 amin=minval(out); amax=maxval(out)
244 print*,
'Ecart-type du modele:', amin, amax
246 amin=minval(out); amax=maxval(out)
247 print*,
'Longueur de rugosite du modele:', amin, amax
257 SUBROUTINE dist_sphe(rf_lon,rf_lat,rlon,rlat,distance)
266 REAL,
INTENT(IN) :: rf_lon, rf_lat
267 REAL,
INTENT(IN) :: rlon(:), rlat(:)
268 REAL,
INTENT(OUT):: distance(size(rlon),size(rlat))
271 LOGICAL,
SAVE :: first=.
true.
272 REAL,
SAVE :: pi, hpi
273 REAL :: pa, pb, cpa, spa, crlo(size(rlon))
276 IF(first) then; pi=4.0*atan(1.0); hpi=pi/2.0; first=.
false.;
END IF
277 crlo(:)=cos(rf_lon-rlon(:))
279 cpa=cos(pa); spa=sin(pa)
282 distance(:,j)=acos(cpa*cos(pb)+spa*sin(pb)*crlo(:))
subroutine dist_sphe(rf_lon, rf_lat, rlon, rlat, distance)
subroutine abort_gcm(modname, message, ierr)
subroutine, public sea_ice(xdata, ydata, glace01, x, y, frac_ice)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
subroutine fine2coarse(x_i, y_i, x_o, y_o, d_o1, d_i, msk, d_o2)
subroutine, public rugsoro(xrel, yrel, relief, xmod, ymod, rugs)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
subroutine, public grille_m(xdata, ydata, entree, x, y, sortie)
subroutine, public rugosite(xdata, ydata, entree, x, y, sortie, mask)