4 SUBROUTINE grille_m(imdep, jmdep, xdata, ydata, entree,
5 . imar, jmar,
x, y, sortie)
37 REAL xdata(imdep),ydata(jmdep)
38 REAL entree(imdep,jmdep)
42 REAL sortie(imar,jmar)
45 REAL a(2200),b(2200),
c(1100),d(1100)
46 REAL number(2200,1100)
47 REAL distans(2200*1100)
48 INTEGER i_proche, j_proche, ij_proche
55 IF (imar.GT.2200 .OR. jmar.GT.1100)
THEN
56 print*,
'imar ou jmar trop grand', imar, jmar
63 a(1) =
x(1) - (
x(2)-
x(1))/2.0
64 b(1) = (
x(1)+
x(2))/2.0
67 b(
i) = (
x(
i)+
x(
i+1))/2.0
70 b(imar) =
x(imar) + (
x(imar)-
x(imar-1))/2.0
72 c(1) = y(1) - (y(2)-y(1))/2.0
73 d(1) = (y(1)+y(2))/2.0
76 d(
j) = (y(
j)+y(
j+1))/2.0
79 d(jmar) = y(jmar) + (y(jmar)-y(jmar-1))/2.0
96 IF( ( xdata(
i)-a(
ii).GE.1.e-5.AND.xdata(
i)-b(
ii).LE.1.e-5 ).OR.
97 . ( xdata(
i)-a(
ii).LE.1.e-5.AND.xdata(
i)-b(
ii).GE.1.e-5 ) )
100 IF( (ydata(
j)-
c(jj).GE.1.e-5.AND.ydata(
j)-d(jj).LE.1.e-5 ).OR.
101 . ( ydata(
j)-
c(jj).LE.1.e-5.AND.ydata(
j)-d(jj).GE.1.e-5 ) )
103 number(
ii,jj) = number(
ii,jj) + 1.0
104 sortie(
ii,jj) = sortie(
ii,jj) + entree(
i,
j)
117 IF (number(
i,
j) .GT. 0.001)
THEN
118 sortie(
i,
j) = sortie(
i,
j) / number(
i,
j)
120 print*,
'probleme,i,j=',
i,
j
122 CALL
dist_sphe(
x(
i),y(
j),xdata,ydata,imdep,jmdep,distans)
124 ij_proche =
ismin(imdep*jmdep,distans,1)
127 zzmin = distans(ij_proche)
128 DO ii = 2, imdep*jmdep
129 IF (distans(
ii).LT.zzmin)
THEN
135 j_proche = (ij_proche-1)/imdep + 1
136 i_proche = ij_proche - (j_proche-1)*imdep
137 print*,
"solution:", ij_proche, i_proche, j_proche
138 sortie(
i,
j) = entree(i_proche,j_proche)
147 SUBROUTINE grille_p(imdep, jmdep, xdata, ydata, entree,
148 . imar, jmar,
x, y, sortie)
180 REAL xdata(imdep),ydata(jmdep)
181 REAL entree(imdep,jmdep)
185 REAL sortie(imar,jmar)
188 REAL a(400),b(400),
c(200),d(200)
190 INTEGER indx(400,200), indy(400,200)
191 REAL dist(400,200), distsom(400,200)
193 IF (imar.GT.400 .OR. jmar.GT.200)
THEN
194 print*,
'imar ou jmar trop grand', imar, jmar
198 IF (imdep.GT.400 .OR. jmdep.GT.200)
THEN
199 print*,
'imdep ou jmdep trop grand', imdep, jmdep
205 a(1) =
x(1) - (
x(2)-
x(1))/2.0
206 b(1) = (
x(1)+
x(2))/2.0
209 b(
i) = (
x(
i)+
x(
i+1))/2.0
212 b(imar) =
x(imar) + (
x(imar)-
x(imar-1))/2.0
217 c(1) = y(1) - (y(2)-y(1))/2.0
218 d(1) = (y(1)+y(2))/2.0
221 d(
j) = (y(
j)+y(
j+1))/2.0
224 d(jmar) = y(jmar) + (y(jmar)-y(jmar-1))/2.0
236 IF( ( xdata(
i)-a(
ii).GE.1.e-5.AND.xdata(
i)-b(
ii).LE.1.e-5 ).OR.
237 . ( xdata(
i)-a(
ii).LE.1.e-5.AND.xdata(
i)-b(
ii).GE.1.e-5 ) )
240 IF( (ydata(
j)-
c(jj).GE.1.e-5.AND.ydata(
j)-d(jj).LE.1.e-5 ).OR.
241 . ( ydata(
j)-
c(jj).LE.1.e-5.AND.ydata(
j)-d(jj).GE.1.e-5 ) )
257 IF (indx(
i,
j).GT.imar .OR. indy(
i,
j).GT.jmar)
THEN
258 print*,
'Probleme grave,i,j,indx,indy=',
278 dist(
i,
j) = sqrt( (xdata(
i)-
x(indx(
i,
j)))**2
279 . +(ydata(
j)-y(indy(
i,
j)))**2 )
280 distsom(indx(
i,
j),indy(
i,
j)) = distsom(indx(
i,
j),indy(
i,
j))
282 number(indx(
i,
j),indy(
i,
j)) = number(indx(
i,
j),indy(
i,
j)) +1.
287 dist(
i,
j) = 1.0 - dist(
i,
j)/distsom(indx(
i,
j),indy(
i,
j))
299 sortie(indx(
i,
j),indy(
i,
j)) = sortie(indx(
i,
j),indy(
i,
j))
300 . + entree(
i,
j) * dist(
i,
j)
301 number(indx(
i,
j),indy(
i,
j)) = number(indx(
i,
j),indy(
i,
j))
307 IF (number(
i,
j) .GT. 0.001)
THEN
308 sortie(
i,
j) = sortie(
i,
j) / number(
i,
j)
310 print*,
'probleme,i,j=',
i,
j
322 SUBROUTINE mask_c_o(imdep, jmdep, xdata, ydata, relief,
323 . imar, jmar,
x, y, mask)
334 REAL xdata(imdep),ydata(jmdep)
335 REAL relief(imdep,jmdep)
342 REAL a(2200),b(2200),
c(1100),d(1100)
343 REAL num_tot(2200,1100), num_oce(2200,1100)
345 IF (imar.GT.2200 .OR. jmar.GT.1100)
THEN
346 print*,
'imar ou jmar trop grand', imar, jmar
351 a(1) =
x(1) - (
x(2)-
x(1))/2.0
352 b(1) = (
x(1)+
x(2))/2.0
355 b(
i) = (
x(
i)+
x(
i+1))/2.0
358 b(imar) =
x(imar) + (
x(imar)-
x(imar-1))/2.0
360 c(1) = y(1) - (y(2)-y(1))/2.0
361 d(1) = (y(1)+y(2))/2.0
364 d(
j) = (y(
j)+y(
j+1))/2.0
367 d(jmar) = y(jmar) + (y(jmar)-y(jmar-1))/2.0
382 IF( ( xdata(
i)-a(
ii).GE.1.e-5.AND.xdata(
i)-b(
ii).LE.1.e-5 ).OR.
383 . ( xdata(
i)-a(
ii).LE.1.e-5.AND.xdata(
i)-b(
ii).GE.1.e-5 ) )
386 IF( (ydata(
j)-
c(jj).GE.1.e-5.AND.ydata(
j)-d(jj).LE.1.e-5 ).OR.
387 . ( ydata(
j)-
c(jj).LE.1.e-5.AND.ydata(
j)-d(jj).GE.1.e-5 ) )
389 num_tot(
ii,jj) = num_tot(
ii,jj) + 1.0
390 IF (.NOT. ( relief(
i,
j) - 0.9. ge. 1.e-5 ) )
391 . num_oce(
ii,jj) = num_oce(
ii,jj) + 1.0
403 IF (num_tot(
i,
j) .GT. 0.001)
THEN
404 IF ( num_oce(
i,
j)/num_tot(
i,
j) - 0.5 .GE. 1.e-5 )
THEN
410 print*,
'probleme,i,j=',
i,
j
422 SUBROUTINE rugosite(imdep, jmdep, xdata, ydata, entree,
423 . imar, jmar,
x, y, sortie, mask)
434 REAL xdata(imdep),ydata(jmdep)
435 REAL entree(imdep,jmdep)
439 REAL sortie(imar,jmar), mask(imar,jmar)
442 REAL a(400),b(400),
c(400),d(400)
443 REAL num_tot(400,400)
444 REAL distans(400*400)
445 INTEGER i_proche, j_proche, ij_proche
452 IF (imar.GT.400 .OR. jmar.GT.400)
THEN
453 print*,
'imar ou jmar trop grand', imar, jmar
458 a(1) =
x(1) - (
x(2)-
x(1))/2.0
459 b(1) = (
x(1)+
x(2))/2.0
462 b(
i) = (
x(
i)+
x(
i+1))/2.0
465 b(imar) =
x(imar) + (
x(imar)-
x(imar-1))/2.0
467 c(1) = y(1) - (y(2)-y(1))/2.0
468 d(1) = (y(1)+y(2))/2.0
471 d(
j) = (y(
j)+y(
j+1))/2.0
474 d(jmar) = y(jmar) + (y(jmar)-y(jmar-1))/2.0
490 IF( ( xdata(
i)-a(
ii).GE.1.e-5.AND.xdata(
i)-b(
ii).LE.1.e-5 ).OR.
491 . ( xdata(
i)-a(
ii).LE.1.e-5.AND.xdata(
i)-b(
ii).GE.1.e-5 ) )
494 IF( (ydata(
j)-
c(jj).GE.1.e-5.AND.ydata(
j)-d(jj).LE.1.e-5 ).OR.
495 . ( ydata(
j)-
c(jj).LE.1.e-5.AND.ydata(
j)-d(jj).GE.1.e-5 ) )
497 sortie(
ii,jj) = sortie(
ii,jj) + log(entree(
i,
j))
498 num_tot(
ii,jj) = num_tot(
ii,jj) + 1.0
509 IF (nint(mask(
i,
j)).EQ.1)
THEN
510 IF (num_tot(
i,
j) .GT. 0.0)
THEN
511 sortie(
i,
j) = sortie(
i,
j) / num_tot(
i,
j)
512 sortie(
i,
j) = exp(sortie(
i,
j))
514 print*,
'probleme,i,j=',
i,
j
516 CALL
dist_sphe(
x(
i),y(
j),xdata,ydata,imdep,jmdep,distans)
518 ij_proche =
ismin(imdep*jmdep,distans,1)
521 zzmin = distans(ij_proche)
522 DO ii = 2, imdep*jmdep
523 IF (distans(
ii).LT.zzmin)
THEN
529 j_proche = (ij_proche-1)/imdep + 1
530 i_proche = ij_proche - (j_proche-1)*imdep
531 print*,
"solution:", ij_proche, i_proche, j_proche
532 sortie(
i,
j) = entree(i_proche,j_proche)
547 SUBROUTINE sea_ice(imdep, jmdep, xdata, ydata, glace01,
548 . imar, jmar,
x, y, frac_ice)
559 REAL xdata(imdep),ydata(jmdep)
560 REAL glace01(imdep,jmdep)
564 REAL frac_ice(imar,jmar)
567 REAL a(400),b(400),
c(400),d(400)
568 REAL num_tot(400,400), num_ice(400,400)
569 REAL distans(400*400)
570 INTEGER i_proche, j_proche, ij_proche
577 IF (imar.GT.400 .OR. jmar.GT.400)
THEN
578 print*,
'imar ou jmar trop grand', imar, jmar
583 a(1) =
x(1) - (
x(2)-
x(1))/2.0
584 b(1) = (
x(1)+
x(2))/2.0
587 b(
i) = (
x(
i)+
x(
i+1))/2.0
590 b(imar) =
x(imar) + (
x(imar)-
x(imar-1))/2.0
592 c(1) = y(1) - (y(2)-y(1))/2.0
593 d(1) = (y(1)+y(2))/2.0
596 d(
j) = (y(
j)+y(
j+1))/2.0
599 d(jmar) = y(jmar) + (y(jmar)-y(jmar-1))/2.0
615 IF( ( xdata(
i)-a(
ii).GE.1.e-5.AND.xdata(
i)-b(
ii).LE.1.e-5 ).OR.
616 . ( xdata(
i)-a(
ii).LE.1.e-5.AND.xdata(
i)-b(
ii).GE.1.e-5 ) )
619 IF( (ydata(
j)-
c(jj).GE.1.e-5.AND.ydata(
j)-d(jj).LE.1.e-5 ).OR.
620 . ( ydata(
j)-
c(jj).LE.1.e-5.AND.ydata(
j)-d(jj).GE.1.e-5 ) )
622 num_tot(
ii,jj) = num_tot(
ii,jj) + 1.0
623 IF (nint(glace01(
i,
j)).EQ.1 )
624 . num_ice(
ii,jj) = num_ice(
ii,jj) + 1.0
636 IF (num_tot(
i,
j) .GT. 0.001)
THEN
637 IF (num_ice(
i,
j).GT.0.001)
THEN
638 frac_ice(
i,
j) = num_ice(
i,
j) / num_tot(
i,
j)
643 print*,
'probleme,i,j=',
i,
j
645 CALL
dist_sphe(
x(
i),y(
j),xdata,ydata,imdep,jmdep,distans)
647 ij_proche =
ismin(imdep*jmdep,distans,1)
650 zzmin = distans(ij_proche)
651 DO ii = 2, imdep*jmdep
652 IF (distans(
ii).LT.zzmin)
THEN
658 j_proche = (ij_proche-1)/imdep + 1
659 i_proche = ij_proche - (j_proche-1)*imdep
660 print*,
"solution:", ij_proche, i_proche, j_proche
661 IF (nint(glace01(i_proche,j_proche)).EQ.1 )
THEN
675 SUBROUTINE rugsoro(imrel, jmrel, xrel, yrel, relief,
676 . immod, jmmod, xmod, ymod, rugs)
692 REAL xrel(imrel),yrel(jmrel)
693 REAL relief(imrel,jmrel)
696 REAL xmod(immod),ymod(jmmod)
697 REAL rugs(immod,jmmod)
701 REAL xtmp(imtmp), ytmp(jmtmp)
702 REAL(KIND=8) cham1tmp(imtmp,jmtmp), cham2tmp(imtmp,jmtmp)
706 REAL a(2200),b(2200),
c(1100),d(1100)
707 REAL number(2200,1100)
709 REAL distans(400*400)
710 INTEGER i_proche, j_proche, ij_proche
712 IF (immod.GT.2200 .OR. jmmod.GT.1100)
THEN
713 print*,
'immod ou jmmod trop grand', immod, jmmod
719 xtmp(1) = -180.0 + 360.0/
REAL(imtmp) / 2.0
721 xtmp(
i) = xtmp(
i-1) + 360.0/
REAL(imtmp)
724 xtmp(
i) = xtmp(
i) /180.0 * 4.0*atan(1.0)
726 ytmp(1) = -90.0 + 180.0/
REAL(jmtmp) / 2.0
728 ytmp(
j) = ytmp(
j-1) + 180.0/
REAL(jmtmp)
731 ytmp(
j) = ytmp(
j) /180.0 * 4.0*atan(1.0)
734 a(1) = xtmp(1) - (xtmp(2)-xtmp(1))/2.0
735 b(1) = (xtmp(1)+xtmp(2))/2.0
738 b(
i) = (xtmp(
i)+xtmp(
i+1))/2.0
740 a(imtmp) = b(imtmp-1)
741 b(imtmp) = xtmp(imtmp) + (xtmp(imtmp)-xtmp(imtmp-1))/2.0
743 c(1) = ytmp(1) - (ytmp(2)-ytmp(1))/2.0
744 d(1) = (ytmp(1)+ytmp(2))/2.0
747 d(
j) = (ytmp(
j)+ytmp(
j+1))/2.0
749 c(jmtmp) = d(jmtmp-1)
750 d(jmtmp) = ytmp(jmtmp) + (ytmp(jmtmp)-ytmp(jmtmp-1))/2.0
767 IF( ( xrel(
i)-a(
ii).GE.1.e-5.AND.xrel(
i)-b(
ii).LE.1.e-5 ).OR.
768 . ( xrel(
i)-a(
ii).LE.1.e-5.AND.xrel(
i)-b(
ii).GE.1.e-5 ) )
771 IF( (yrel(
j)-
c(jj).GE.1.e-5.AND.yrel(
j)-d(jj).LE.1.e-5 ).OR.
772 . ( yrel(
j)-
c(jj).LE.1.e-5.AND.yrel(
j)-d(jj).GE.1.e-5 ) )
774 number(
ii,jj) = number(
ii,jj) + 1.0
775 cham1tmp(
ii,jj) = cham1tmp(
ii,jj) + relief(
i,
j)
776 cham2tmp(
ii,jj) = cham2tmp(
ii,jj)
777 . + relief(
i,
j)*relief(
i,
j)
788 IF (number(
i,
j) .GT. 0.001)
THEN
789 cham1tmp(
i,
j) = cham1tmp(
i,
j) / number(
i,
j)
790 cham2tmp(
i,
j) = cham2tmp(
i,
j) / number(
i,
j)
791 zzzz=cham2tmp(
i,
j)-cham1tmp(
i,
j)**2
792 if (zzzz .lt. 0.0)
then
793 if (zzzz .gt. -7.5)
then
795 print*,
'Pb rugsoro, -7.5 < zzzz < 0, => zzz = 0.0'
797 stop
'Pb rugsoro, zzzz <-7.5'
800 cham2tmp(
i,
j) = sqrt(zzzz)
802 print*,
'probleme,i,j=',
i,
j
812 IF (cham2tmp(
i,
j).GT.amax) amax = cham2tmp(
i,
j)
813 IF (cham2tmp(
i,
j).LT.amin) amin = cham2tmp(
i,
j)
816 print*,
'Ecart-type 1x1:', amin, amax
820 a(1) = xmod(1) - (xmod(2)-xmod(1))/2.0
821 b(1) = (xmod(1)+xmod(2))/2.0
824 b(
i) = (xmod(
i)+xmod(
i+1))/2.0
826 a(immod) = b(immod-1)
827 b(immod) = xmod(immod) + (xmod(immod)-xmod(immod-1))/2.0
829 c(1) = ymod(1) - (ymod(2)-ymod(1))/2.0
830 d(1) = (ymod(1)+ymod(2))/2.0
833 d(
j) = (ymod(
j)+ymod(
j+1))/2.0
835 c(jmmod) = d(jmmod-1)
836 d(jmmod) = ymod(jmmod) + (ymod(jmmod)-ymod(jmmod-1))/2.0
852 IF( ( xtmp(
i)-a(
ii).GE.1.e-5.AND.xtmp(
i)-b(
ii).LE.1.e-5 ).OR.
853 . ( xtmp(
i)-a(
ii).LE.1.e-5.AND.xtmp(
i)-b(
ii).GE.1.e-5 ) )
856 IF( (ytmp(
j)-
c(jj).GE.1.e-5.AND.ytmp(
j)-d(jj).LE.1.e-5 ).OR.
857 . ( ytmp(
j)-
c(jj).LE.1.e-5.AND.ytmp(
j)-d(jj).GE.1.e-5 ) )
859 number(
ii,jj) = number(
ii,jj) + 1.0
860 rugs(
ii,jj) = rugs(
ii,jj)
861 . + log(max(0.001_8,cham2tmp(
i,
j)))
872 IF (number(
i,
j) .GT. 0.001)
THEN
873 rugs(
i,
j) = rugs(
i,
j) / number(
i,
j)
874 rugs(
i,
j) = exp(rugs(
i,
j))
876 print*,
'probleme,i,j=',
i,
j
878 CALL
dist_sphe(xmod(
i),ymod(
j),xtmp,ytmp,imtmp,jmtmp,distans)
880 ij_proche =
ismin(imtmp*jmtmp,distans,1)
883 zzmin = distans(ij_proche)
884 DO ii = 2, imtmp*jmtmp
885 IF (distans(
ii).LT.zzmin)
THEN
891 j_proche = (ij_proche-1)/imtmp + 1
892 i_proche = ij_proche - (j_proche-1)*imtmp
893 print*,
"solution:", ij_proche, i_proche, j_proche
894 rugs(
i,
j) = log(max(0.001_8,cham2tmp(i_proche,j_proche)))
903 IF (rugs(
i,
j).GT.amax) amax = rugs(
i,
j)
904 IF (rugs(
i,
j).LT.amin) amin = rugs(
i,
j)
907 print*,
'Ecart-type du modele:', amin, amax
911 rugs(
i,
j) = rugs(
i,
j) / amax * 20.0
919 IF (rugs(
i,
j).GT.amax) amax = rugs(
i,
j)
920 IF (rugs(
i,
j).LT.amin) amin = rugs(
i,
j)
923 print*,
'Longueur de rugosite du modele:', amin, amax
928 SUBROUTINE dist_sphe(rf_lon,rf_lat,rlon,rlat,im,jm,distance)
961 pa =
pi/2.0 - rlat1*
pi/180.0
962 pb =
pi/2.0 - rlat2*
pi/180.0
963 p = (rlon1-rlon2)*
pi/180.0
965 dist = acos( cos(
pa)*cos(pb) + sin(
pa)*sin(pb)*cos(p))