LMDZ
write_field.F90
Go to the documentation of this file.
1 !
2 ! $Id: write_field.F90 2342 2015-08-19 13:21:38Z emillour $
3 !
4 module write_field
5 implicit none
6 
7  integer, parameter :: maxwritefield = 100
8  integer, dimension(MaxWriteField),save :: fieldid
9  integer, dimension(MaxWriteField),save :: fieldvarid
10  integer, dimension(MaxWriteField),save :: fieldindex
11  character(len=255), dimension(MaxWriteField) :: fieldname
12 
13  integer,save :: nbfield = 0
14 
15  interface writefield
16  module procedure writefield3d,writefield2d,writefield1d
17  end interface writefield
18  contains
19 
20  function getfieldindex(name)
21  implicit none
22  integer :: GetFieldindex
23  character(len=*) :: name
24 
25  character(len=255) :: TrueName
26  integer :: i
27 
28 
29  truename=trim(adjustl(name))
30 
31  getfieldindex=-1
32  do i=1,nbfield
33  if (truename==fieldname(i)) then
34  getfieldindex=i
35  exit
36  endif
37  enddo
38  end function getfieldindex
39 
40  subroutine writefield3d(name,Field)
41  implicit none
42  character(len=*) :: name
43  real, dimension(:,:,:) :: Field
44  integer, dimension(3) :: Dim
45 
46  dim=shape(field)
47  call writefield_gen(name,field,dim(1),dim(2),dim(3))
48 
49  end subroutine writefield3d
50 
51  subroutine writefield2d(name,Field)
52  implicit none
53  character(len=*) :: name
54  real, dimension(:,:) :: Field
55  integer, dimension(2) :: Dim
56 
57  dim=shape(field)
58  call writefield_gen(name,field,dim(1),dim(2),1)
59 
60  end subroutine writefield2d
61 
62  subroutine writefield1d(name,Field)
63  implicit none
64  character(len=*) :: name
65  real, dimension(:) :: Field
66  integer, dimension(1) :: Dim
67 
68  dim=shape(field)
69  call writefield_gen(name,field,dim(1),1,1)
70 
71  end subroutine writefield1d
72 
73  subroutine writefield_gen(name,Field,dimx,dimy,dimz)
74  implicit none
75  include 'netcdf.inc'
76  character(len=*) :: name
77  integer :: dimx,dimy,dimz
78  real,dimension(dimx,dimy,dimz) :: Field
79  integer,dimension(dimx*dimy*dimz) :: ndex
80  integer :: status
81  integer :: index
82  integer :: start(4)
83  integer :: count(4)
84 
85 
86  index=getfieldindex(name)
87  if (index==-1) then
88  call createnewfield(name,dimx,dimy,dimz)
89  index=getfieldindex(name)
90  else
91  fieldindex(index)=fieldindex(index)+1.
92  endif
93 
94  start(1)=1
95  start(2)=1
96  start(3)=1
97  start(4)=fieldindex(index)
98 
99  count(1)=dimx
100  count(2)=dimy
101  count(3)=dimz
102  count(4)=1
103 
104  status = nf_put_vara_double(fieldid(index),fieldvarid(index),start,count,field)
105  status = nf_sync(fieldid(index))
106 
107  end subroutine writefield_gen
108 
109  subroutine createnewfield(name,dimx,dimy,dimz)
110  implicit none
111  include 'netcdf.inc'
112  character(len=*) :: name
113  integer :: dimx,dimy,dimz
114  integer :: TabDim(4)
115  integer :: status
116 
117 
118  nbfield=nbfield+1
119  fieldname(nbfield)=trim(adjustl(name))
121 
122 
123  status = nf_create(trim(adjustl(name))//'.nc', nf_clobber, fieldid(nbfield))
124  status = nf_def_dim(fieldid(nbfield),'X',dimx,tabdim(1))
125  status = nf_def_dim(fieldid(nbfield),'Y',dimy,tabdim(2))
126  status = nf_def_dim(fieldid(nbfield),'Z',dimz,tabdim(3))
127  status = nf_def_dim(fieldid(nbfield),'iter',nf_unlimited,tabdim(4))
128  status = nf_def_var(fieldid(nbfield),fieldname(nbfield),nf_double,4,tabdim,fieldvarid(nbfield))
129  status = nf_enddef(fieldid(nbfield))
130 
131  end subroutine createnewfield
132 
133 
134 
135  subroutine write_field1d(name,Field)
136  implicit none
137 
138  integer, parameter :: MaxDim=1
139  character(len=*) :: name
140  real, dimension(:) :: Field
141  real, dimension(:),allocatable :: New_Field
142  character(len=20) :: str
143  integer, dimension(MaxDim) :: Dim
144  integer :: i,nb
145  integer, parameter :: id=10
146  integer, parameter :: NbCol=4
147  integer :: ColumnSize
148  integer :: pos
149  character(len=255) :: form
150  character(len=255) :: MaxLen
151 
152 
153  open(unit=id,file=name//'.field',form='formatted',status='replace')
154  write (id,'("----- Field '//name//'",//)')
155  dim=shape(field)
156  maxlen=int2str(len(trim(int2str(dim(1)))))
157  columnsize=20+6+3+len(trim(int2str(dim(1))))
158  nb=0
159  pos=2
160  do i=1,dim(1)
161  nb=nb+1
162 
163  if (mod(nb,nbcol)==0) then
164  form='(t'//trim(int2str(pos))// ',i'//trim(maxlen) //'," ---> ",g22.16,/)'
165  pos=2
166  else
167  form='(t'//trim(int2str(pos))// ',i'//trim(maxlen) //'," ---> ",g22.16," | ",)'
168  pos=pos+columnsize
169  endif
170  write (id,form,advance='no') i,field(i)
171  enddo
172 
173  close(id)
174 
175  end subroutine write_field1d
176 
177  subroutine write_field2d(name,Field)
178  implicit none
179 
180  integer, parameter :: MaxDim=2
181  character(len=*) :: name
182  real, dimension(:,:) :: Field
183  real, dimension(:,:),allocatable :: New_Field
184  character(len=20) :: str
185  integer, dimension(MaxDim) :: Dim
186  integer :: i,j,nb
187  integer, parameter :: id=10
188  integer, parameter :: NbCol=4
189  integer :: ColumnSize
190  integer :: pos,offset
191  character(len=255) :: form
192  character(len=255) :: spacing
193 
194  open(unit=id,file=name//'.field',form='formatted',status='replace')
195  write (id,'("----- Field '//name//'",//)')
196 
197  dim=shape(field)
198  offset=len(trim(int2str(dim(1))))+len(trim(int2str(dim(2))))+3
199  columnsize=20+6+3+offset
200 
201  spacing='(t2,"'//repeat('-',columnsize*nbcol)//'")'
202 
203  do i=1,dim(2)
204  nb=0
205  pos=2
206  do j=1,dim(1)
207  nb=nb+1
208 
209  if (mod(nb,nbcol)==0) then
210  form='(t'//trim(int2str(pos))// &
211  ',"('//trim(int2str(j))//',' &
212  //trim(int2str(i))//')",t' &
213  //trim(int2str(pos+offset)) &
214  //'," ---> ",g22.16,/)'
215  pos=2
216  else
217  form='(t'//trim(int2str(pos))// &
218  ',"('//trim(int2str(j))//',' &
219  //trim(int2str(i))//')",t' &
220  //trim(int2str(pos+offset)) &
221  //'," ---> ",g22.16," | ")'
222  pos=pos+columnsize
223  endif
224  write (id,form,advance='no') field(j,i)
225  enddo
226  if (mod(nb,nbcol)==0) then
227  write (id,spacing)
228  else
229  write (id,'("")')
230  write (id,spacing)
231  endif
232  enddo
233 
234  end subroutine write_field2d
235 
236  subroutine write_field3d(name,Field)
237  implicit none
238 
239  integer, parameter :: MaxDim=3
240  character(len=*) :: name
241  real, dimension(:,:,:) :: Field
242  real, dimension(:,:,:),allocatable :: New_Field
243  integer, dimension(MaxDim) :: Dim
244  integer :: i,j,k,nb
245  integer, parameter :: id=10
246  integer, parameter :: NbCol=4
247  integer :: ColumnSize
248  integer :: pos,offset
249  character(len=255) :: form
250  character(len=255) :: spacing
251 
252  open(unit=id,file=name//'.field',form='formatted',status='replace')
253  write (id,'("----- Field '//name//'"//)')
254 
255  dim=shape(field)
256  offset=len(trim(int2str(dim(1))))+len(trim(int2str(dim(2))))+len(trim(int2str(dim(3))))+4
257  columnsize=22+6+3+offset
258 
259 ! open(unit=id,file=name,form=formatted
260 
261  spacing='(t2,"'//repeat('-',columnsize*nbcol)//'")'
262 
263  do i=1,dim(3)
264 
265  do j=1,dim(2)
266  nb=0
267  pos=2
268 
269  do k=1,dim(1)
270  nb=nb+1
271 
272  if (mod(nb,nbcol)==0) then
273  form='(t'//trim(int2str(pos))// &
274  ',"('//trim(int2str(k))//',' &
275  //trim(int2str(j))//',' &
276  //trim(int2str(i))//')",t' &
277  //trim(int2str(pos+offset)) &
278  //'," ---> ",g22.16,/)'
279  pos=2
280  else
281  form='(t'//trim(int2str(pos))// &
282  ',"('//trim(int2str(k))//',' &
283  //trim(int2str(j))//',' &
284  //trim(int2str(i))//')",t' &
285  //trim(int2str(pos+offset)) &
286  //'," ---> ",g22.16," | ")'
287 ! dépent de l'implémention, sur compaq, c'est necessaire
288 ! Pos=Pos+ColumnSize
289  endif
290  write (id,form,advance='no') field(k,j,i)
291  enddo
292  if (mod(nb,nbcol)==0) then
293  write (id,spacing)
294  else
295  write (id,'("")')
296  write (id,spacing)
297  endif
298  enddo
299  write (id,spacing)
300  enddo
301 
302  close(id)
303 
304  end subroutine write_field3d
305 
306  function int2str(int)
307  implicit none
308  integer, parameter :: MaxLen=10
309  integer,intent(in) :: int
310  character(len=MaxLen) :: int2str
311  logical :: flag
312  integer :: i
313  flag=.true.
314 
315  i=int
316 
317  int2str=''
318  do while (flag)
319  int2str=char(mod(i,10)+48)//int2str
320  i=i/10
321  if (i==0) flag=.false.
322  enddo
323  end function int2str
324 
325 end module write_field
326 
integer, dimension(maxwritefield), save fieldindex
Definition: write_field.F90:10
subroutine write_field2d(name, Field)
subroutine write_field3d(name, Field)
subroutine createnewfield(name, dimx, dimy, dimz)
subroutine writefield1d(name, Field)
Definition: write_field.F90:63
integer, dimension(maxwritefield), save fieldvarid
Definition: write_field.F90:9
integer, dimension(maxwritefield), save fieldid
Definition: write_field.F90:8
integer function getfieldindex(name)
Definition: write_field.F90:21
integer, save nbfield
Definition: write_field.F90:13
character(len=255), dimension(maxwritefield) fieldname
Definition: write_field.F90:11
subroutine writefield_gen(name, Field, dimx, dimy, dimz)
Definition: write_field.F90:74
subroutine write_field1d(name, Field)
!$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
!$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 writefield3d(name, Field)
Definition: write_field.F90:41
subroutine writefield2d(name, Field)
Definition: write_field.F90:52
character(len=maxlen) function int2str(int)
integer, parameter maxwritefield
Definition: write_field.F90:7
!$Header!integer nvarmx s s unit
Definition: gradsdef.h:20