LMDZ
dump2ds.F
Go to the documentation of this file.
1  SUBROUTINE dump2ds(im,jm,z,nom_z)
2 C Copyright (C) 2005 Centre National de la Recherche Scientifique
3 c ==================================================================
4 c Perform a scatter plot print of big matrices using regular
5 c intervals between min and max matrix coefficient values.
6 c ==================================================================
7 c adapted from LMD3 by Alain Lahellec and retranscipted for LMDZ5
8 c NAN et INF ajoute aux plots Pat fin 2006
9 c ==================================================================
10 c Comme dump2d sauf que le signe est préservé, la valeur zero
11 c identifiee par un blanc.
12 c detection des Infty (= ou -) et NaN (?)
13 c ==================================================================
14  IMPLICIT NONE
15  INTEGER im,jm
16  REAL z(im,jm),az
17  CHARACTER*32 jform,jline*1000
18  CHARACTER*1 iform(32)
19  CHARACTER*16 F1000
20  logical zinf,znan,zsign
21  CHARACTER (len=*) :: nom_z
22  INTEGER*4 icheck(2)
23  equivalence(az,icheck)
24  equivalence(iform,jform)
25  DATA jform/'-@zyxwvutsrqpon NOPQRSTUVWXYZ*+?'/
26  INTEGER i,j,k,imin,imax,jmin,jmax,kzero,kchar(im)
27  REAL zmin,zmax,zllu,zllm
28  write(f1000,'(''(4x,'',I3,''(1H-))'')')im+3
29  DO 10001 i=1,200
30  jline(1+(i-1)*5:5*i)='. '
31 10001 CONTINUE
32 10002 zmin=z(1,1)
33  imin=1
34  jmin=1
35  zmax=z(1,1)
36  imax=1
37  jmax=1
38  kzero=0
39  DO 10003 j=1,jm
40  DO 10005 i=1,im
41  IF(.NOT.( z(i,j).GT.zmax))GOTO 10007
42  zmax=z(i,j)
43  imax=i
44  jmax=j
45 10007 IF(.NOT.( z(i,j).LT.zmin))GOTO 10009
46  zmin=z(i,j)
47  imin=i
48  jmin=j
49 10009 IF(.NOT.( z(i,j).eq.0.))GOTO 10011
50  kzero=kzero+1
51 10011 CONTINUE
52 10005 CONTINUE
53 10006 CONTINUE
54 10003 CONTINUE
55 10004 zsign=(sign(1.,zmin)*sign(1.,zmax).gt.0.)
56  WRITE(*,*)'>>> dump2ds: ',trim(nom_z)
57  print*,'>>> ',kzero,' zero values <<<'
58  IF(.NOT.( zmin.lt.0.))GOTO 10013
59  print2000,' [MIN:',zmin,'(',imin,',',jmin,') (-@zyxwvutsrqpon NOPQ
60  *RSTUVWXYZ*+) ',zmax,'(',imax,',',jmax,'):MAX]'
61  GOTO 10014
62 10013 print2000,' [MIN:',zmin,'(',imin,',',jmin,') ( NOPQRSTUVWXYZ*+) ',
63  *zmax,'(',imax,',',jmax,'):MAX]'
64 10014 CONTINUE
65 2000 Format(a,1pg11.4,a1,i3,a1,i3,a,1pg11.4,a1,i3,a1,i3,a)
66  IF(.NOT.( zmax.GT.zmin))GOTO 10015
67  zllm=max(abs(zmax),abs(zmin))
68  zllu=min(abs(zmax),abs(zmin))
69  if(im.ge.100)WRITE(*,'(104x,900i1)')(mod(i/100,10),i=100,im)
70  WRITE(*,'(14x,1000i1)')(mod(i/10,10),i=10,im)
71  WRITE(*,'(5x,1009i1)')(mod(i,10),i=1,im)
72  write(*,f1000)
73  zinf=.false.
74  znan=.false.
75  DO 10017 j=1,jm
76  DO 10019 i=1,im
77  az=abs(z(i,j))
78  IF(.NOT.( az.eq.0.))GOTO 10021
79  kchar(i)=16
80  GOTO 10022
81 10021 IF(.NOT.((az.ne.0.and.icheck(1).eq.0.and.icheck(2).eq.2146435072))
82  *)GOTO 10023
83  kchar(i)=31
84  zinf=.true.
85  GOTO 10022
86 10023 IF(.NOT.((az.ne.0.and.icheck(1).eq.0.and.icheck(2).eq.2146959360))
87  *)GOTO 10024
88  kchar(i)=32
89  znan=.true.
90  GOTO 10022
91 10024 IF(.NOT.( zsign))GOTO 10025
92  kchar(i)=nint(13.*(az-zllu)/(zllm-zllu)+17)
93  GOTO 10026
94 10025 kchar(i)=nint(13.*az/zllm+17)
95 10026 CONTINUE
96 10022 IF(.NOT.( z(i,j).lt.0.))GOTO 10027
97  kchar(i)=32-kchar(i)
98 10027 CONTINUE
99 10019 CONTINUE
100 10020 WRITE(*,'(1x,i3,''|'',1000a)')j+1,(iform(kchar(i)),i=1,im),'|','|
101  *'
102 10017 CONTINUE
103 10018 write(*,f1000)
104  WRITE(*,'(5x,1000i1)')(mod(i,10),i=1,im)
105  WRITE(*,'(14x,1000i1)')(mod(i/10,10),i=10,im)
106  if(im.ge.100)WRITE(*,'(104x,900i1)')(mod(i/100,10),i=100,im)
107  GOTO 10016
108 10015 print*,'>>> ZERO MAP <<<'
109 10016 if(zinf)print*,' *** Infty value(s) (+ or -) in map ***'
110  if(znan)print*,' *** NaN value(s) (?) in map ***'
111  print*
112  RETURN
113  END
!$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
Definition: calcul_STDlev.h:26
subroutine dump2ds(im, jm, z, nom_z)
Definition: dump2ds.F:2
!$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