source: LMDZ5/branches/IPSLCM6.0.10/libf/phymar/iotd_ecrit.F90 @ 5445

Last change on this file since 5445 was 2160, checked in by Laurent Fairhead, 10 years ago

Merged trunk changes -r2070:2158 into testing branch. Compilation problems introduced by revision r2155 have been corrected by hand

File size: 5.5 KB
Line 
1      subroutine iotd_ecrit(nom,llm,titre,unite,px)
2
3
4!  Ecriture de variables diagnostiques au choix dans la physique
5!  dans un fichier NetCDF nomme  'diagfi'. Ces variables peuvent etre
6!  3d (ex : temperature), 2d (ex : temperature de surface), ou
7!  0d (pour un scalaire qui ne depend que du temps : ex : la longitude
8!  solaire)
9!  (ou encore 1d, dans le cas de testphys1d, pour sortir une colonne)
10!  La periode d'ecriture est donnee par
11!  "ecritphy " regle dans le fichier de controle de run :  run.def
12!
13!    writediagfi peut etre appele de n'importe quelle subroutine
14!    de la physique, plusieurs fois. L'initialisation et la creation du
15!    fichier se fait au tout premier appel.
16!
17! WARNING : les variables dynamique (u,v,t,q,ps)
18!  sauvees par writediagfi avec une
19! date donnee sont legerement differentes que dans le fichier histoire car
20! on ne leur a pas encore ajoute de la dissipation et de la physique !!!
21! IL est  RECOMMANDE d'ajouter les tendance physique a ces variables
22! avant l'ecriture dans diagfi (cf. physiq.F)
23
24! Modifs: Aug.2010 Ehouarn: enforce outputs to be real*4
25!
26!  parametres (input) :
27!  ----------
28!      unit : unite logique du fichier de sortie (toujours la meme)
29!      nom  : nom de la variable a sortir (chaine de caracteres)
30!      titre: titre de la variable (chaine de caracteres)
31!      unite : unite de la variable (chaine de caracteres)
32!      px : variable a sortir (real 0, 1, 2, ou 3d)
33!
34!=================================================================
35 
36      implicit none
37
38! Commons
39
40#include "netcdf.inc"
41#include "iotd.h"
42
43
44! Arguments on input:
45      integer llm
46      character (len=*) :: nom,titre,unite
47      integer imjmax
48      parameter (imjmax=100000)
49      real px(imjmax*llm)
50
51! Local variables:
52
53      real*4 date
54      real*4 zx(imjmax*llm)
55
56
57      integer ierr,ndim,dim_cc(4)
58      integer iq
59      integer i,j,l
60
61      integer zitau
62      character firstnom*20
63      SAVE firstnom
64      SAVE zitau
65      SAVE date
66      data firstnom /'1234567890'/
67      data zitau /0/
68
69! Ajouts
70      integer, save :: ntime=0
71      integer :: idim,varid
72      character (len =50):: fichnom
73      integer, dimension(4) :: id
74      integer, dimension(4) :: edges,corner
75     
76
77!***************************************************************
78! Initialisation of 'firstnom' and create/open the "diagfi.nc" NetCDF file
79! ------------------------------------------------------------------------
80! (Au tout premier appel de la subroutine durant le run.)
81
82
83!--------------------------------------------------------
84! Write the variables to output file if it's time to do so
85!--------------------------------------------------------
86
87
88! Compute/write/extend 'Time' coordinate (date given in days)
89! (done every "first call" (at given time level) to writediagfi)
90! Note: date is incremented as 1 step ahead of physics time
91!--------------------------------------------------------
92
93        zx(1:imax*jmax*llm)=px(1:imax*jmax*llm)
94        if (firstnom =='1234567890') then
95            firstnom=nom
96        endif
97
98!      print*,'nom ',nom,firstnom
99
100!! Quand on tombe sur la premiere variable on ajoute un pas de temps
101        if (nom.eq.firstnom) then
102        ! We have identified a "first call" (at given date)
103
104           ntime=ntime+1 ! increment # of stored time steps
105
106!!          print*,'ntime ',ntime
107           date=ntime
108!          date= float (zitau +1)/float (day_step)
109
110           ! compute corresponding date (in days and fractions thereof)
111           ! Get NetCDF ID of 'Time' variable
112
113           ierr=NF_SYNC(nid)
114
115           ierr= NF_INQ_VARID(nid,"Time",varid)
116           ! Write (append) the new date to the 'Time' array
117
118
119           ierr= NF_PUT_VARA_REAL(nid,varid,ntime,1,date)
120
121!          print*,'date ',date,ierr,nid
122!        print*,'IOTD Date ,varid,nid,ntime,date',varid,nid,ntime,date
123
124           if (ierr.ne.NF_NOERR) then
125              write(*,*) "***** PUT_VAR matter in writediagfi_nc"
126              write(*,*) "***** with time"
127              write(*,*) 'ierr=', ierr   
128           endif
129
130!          write(6,*)'WRITEDIAGFI: date= ', date
131        end if ! of if (nom.eq.firstnom)
132
133
134!Case of a 3D variable
135!---------------------
136        if (llm==lmax) then
137           ndim=4
138           corner(1)=1
139           corner(2)=1
140           corner(3)=1
141           corner(4)=ntime
142           edges(1)=imax
143           edges(2)=jmax
144           edges(3)=llm
145           edges(4)=1
146           dim_cc=dim_coord
147
148
149!Case of a 2D variable
150!---------------------
151
152        else if (llm==1) then
153           ndim=3
154           corner(1)=1
155           corner(2)=1
156           corner(3)=ntime
157           corner(4)=1
158           edges(1)=imax
159           edges(2)=jmax
160           edges(3)=1
161           edges(4)=1
162           dim_cc(1:2)=dim_coord(1:2)
163           dim_cc(3)=dim_coord(4)
164
165        endif ! of if llm=1 ou llm
166
167! AU premier pas de temps, on crée les variables
168!-----------------------------------------------
169
170      if (ntime==1) then
171          ierr = NF_REDEF (nid)
172          ierr = NF_DEF_VAR(nid,nom,NF_FLOAT,ndim,dim_cc,varid)
173          print*,'DEF ',nom,nid,varid
174          ierr = NF_ENDDEF(nid)
175      else
176         ierr= NF_INQ_VARID(nid,nom,varid)
177          print*,'INQ ',nom,nid,varid
178! Commandes pour recuperer automatiquement les coordonnees
179!             ierr= NF_INQ_DIMID(nid,"longitude",id(1))
180      endif
181
182
183      ierr= NF_PUT_VARA_REAL(nid,varid,corner,edges,zx)
184
185      if (ierr.ne.NF_NOERR) then
186           write(*,*) "***** PUT_VAR problem in writediagfi"
187           write(*,*) "***** with ",nom
188           write(*,*) 'ierr=', ierr
189      endif
190
191
192      end
Note: See TracBrowser for help on using the repository browser.