source: LMDZ6/trunk/libf/misc/write_field.F90 @ 5075

Last change on this file since 5075 was 5075, checked in by abarral, 2 months ago

[continued & end] replace netcdf by lmdz_netcdf.F90 wrapper
"use netcdf" is now only used in lmdz_netcdf.F90 (except ecrad and obsolete/)
<include "netcdf.inc"> is now likewise only used in lmdz_netcdf.F90.

systematically specify explicitely <USE lmdz_netcdf, ONLY:> (probably left some missing, to correct later on)

Further replacement of nf_put_* by nf90_put_* (same for _get_)

[minor] replace deprecated boolean operators along the way

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1module write_field
2  USE lmdz_netcdf, ONLY: nf_sync, nf90_put_var, nf_enddef, nf_def_dim, nf_unlimited, &
3      nf_clobber, nf90_format, nf_create, nf_def_var
4
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      character(len=*) :: name
76      integer :: dimx,dimy,dimz
77      real,dimension(dimx,dimy,dimz) :: Field
78      integer,dimension(dimx*dimy*dimz) :: ndex
79      integer :: status
80      integer :: index
81      integer :: start(4)
82      integer :: count(4)
83     
84           
85      Index=GetFieldIndex(name)
86      if (Index==-1) then
87        call CreateNewField(name,dimx,dimy,dimz)
88        Index=GetFieldIndex(name)
89      else
90        FieldIndex(Index)=FieldIndex(Index)+1.
91      endif
92     
93      start(1)=1
94      start(2)=1
95      start(3)=1
96      start(4)=FieldIndex(Index)
97
98      count(1)=dimx
99      count(2)=dimy
100      count(3)=dimz
101      count(4)=1
102
103      status = nf90_put_var(FieldId(Index),FieldVarId(Index),Field,start,count)
104      status = NF_SYNC(FieldId(Index))
105     
106    end subroutine WriteField_gen
107       
108    subroutine CreateNewField(name,dimx,dimy,dimz)
109    implicit none
110      character(len=*) :: name
111      integer :: dimx,dimy,dimz
112      integer :: TabDim(4)
113      integer :: status
114     
115     
116      NbField=NbField+1
117      FieldName(NbField)=TRIM(ADJUSTL(name))
118      FieldIndex(NbField)=1
119     
120     
121      status = NF_CREATE(TRIM(ADJUSTL(name))//'.nc', NF_CLOBBER, FieldId(NbField))
122      status = NF_DEF_DIM(FieldId(NbField),'X',dimx,TabDim(1))
123      status = NF_DEF_DIM(FieldId(NbField),'Y',dimy,TabDim(2))
124      status = NF_DEF_DIM(FieldId(NbField),'Z',dimz,TabDim(3))
125      status = NF_DEF_DIM(FieldId(NbField),'iter',NF_UNLIMITED,TabDim(4))
126      status = NF_DEF_VAR(FieldId(NbField),FieldName(NbField),NF90_FORMAT,4,TabDim,FieldVarId(NbField))
127      status = NF_ENDDEF(FieldId(NbField))
128
129    end subroutine CreateNewField
130   
131  subroutine write_field1D(name,Field)
132    implicit none
133 
134    integer, parameter :: MaxDim=1
135    character(len=*)   :: name
136    real, dimension(:) :: Field
137    real, dimension(:),allocatable :: New_Field
138    character(len=20) :: str
139    integer, dimension(MaxDim) :: Dim
140    integer :: i,nb
141    integer, parameter :: id=10
142    integer, parameter :: NbCol=4
143    integer :: ColumnSize
144    integer :: pos
145    character(len=255) :: form
146    character(len=255) :: MaxLen
147   
148   
149    open(unit=id,file=name//'.field',form='formatted',status='replace')
150    write (id,'("----- Field '//name//'",//)')
151    Dim=shape(Field)
152    MaxLen=int2str(len(trim(int2str(Dim(1)))))
153    ColumnSize=20+6+3+len(trim(int2str(Dim(1))))
154    Nb=0
155    Pos=2
156    do i=1,Dim(1)
157      nb=nb+1
158     
159      if (MOD(nb,NbCol)==0) then
160        form='(t'//trim(int2str(pos))// ',i'//trim(MaxLen) //'," ---> ",g22.16,/)'
161        Pos=2
162      else
163        form='(t'//trim(int2str(pos))// ',i'//trim(MaxLen) //'," ---> ",g22.16," | ",)'
164        Pos=Pos+ColumnSize
165      endif
166      write (id,form,advance='no') i,Field(i)
167    enddo
168     
169    close(id)
170
171  end subroutine write_field1D
172
173  subroutine write_field2D(name,Field)
174    implicit none
175 
176    integer, parameter :: MaxDim=2
177    character(len=*)   :: name
178    real, dimension(:,:) :: Field
179    real, dimension(:,:),allocatable :: New_Field
180    character(len=20) :: str
181    integer, dimension(MaxDim) :: Dim
182    integer :: i,j,nb
183    integer, parameter :: id=10
184    integer, parameter :: NbCol=4
185    integer :: ColumnSize
186    integer :: pos,offset
187    character(len=255) :: form
188    character(len=255) :: spacing
189   
190    open(unit=id,file=name//'.field',form='formatted',status='replace')
191    write (id,'("----- Field '//name//'",//)')
192   
193    Dim=shape(Field)
194    offset=len(trim(int2str(Dim(1))))+len(trim(int2str(Dim(2))))+3
195    ColumnSize=20+6+3+offset
196
197    spacing='(t2,"'//repeat('-',ColumnSize*NbCol)//'")'
198   
199    do i=1,Dim(2)
200      nb=0
201      Pos=2
202      do j=1,Dim(1)
203        nb=nb+1
204     
205        if (MOD(nb,NbCol)==0) then
206          form='(t'//trim(int2str(pos))//            &
207               ',"('//trim(int2str(j))//','          &
208                    //trim(int2str(i))//')",t'       &
209                    //trim(int2str(pos+offset))     &   
210                    //'," ---> ",g22.16,/)'
211          Pos=2
212        else
213          form='(t'//trim(int2str(pos))//            &
214               ',"('//trim(int2str(j))//','          &
215                    //trim(int2str(i))//')",t'       &
216                    //trim(int2str(pos+offset))     &   
217                    //'," ---> ",g22.16," | ")'
218          Pos=Pos+ColumnSize
219        endif
220        write (id,form,advance='no') Field(j,i)
221      enddo
222      if (MOD(nb,NbCol)==0) then
223        write (id,spacing)
224      else
225        write (id,'("")')
226        write (id,spacing)
227      endif
228    enddo
229     
230  end subroutine write_field2D
231 
232  subroutine write_field3D(name,Field)
233    implicit none
234 
235    integer, parameter :: MaxDim=3
236    character(len=*)   :: name
237    real, dimension(:,:,:) :: Field
238    real, dimension(:,:,:),allocatable :: New_Field
239    integer, dimension(MaxDim) :: Dim
240    integer :: i,j,k,nb
241    integer, parameter :: id=10
242    integer, parameter :: NbCol=4
243    integer :: ColumnSize
244    integer :: pos,offset
245    character(len=255) :: form
246    character(len=255) :: spacing
247
248    open(unit=id,file=name//'.field',form='formatted',status='replace')
249    write (id,'("----- Field '//name//'"//)')
250   
251    Dim=shape(Field)
252    offset=len(trim(int2str(Dim(1))))+len(trim(int2str(Dim(2))))+len(trim(int2str(Dim(3))))+4
253    ColumnSize=22+6+3+offset
254
255!    open(unit=id,file=name,form=formatted
256   
257    spacing='(t2,"'//repeat('-',ColumnSize*NbCol)//'")'
258   
259    do i=1,Dim(3)
260   
261      do j=1,Dim(2)
262        nb=0
263        Pos=2
264       
265        do k=1,Dim(1)
266        nb=nb+1
267     
268          if (MOD(nb,NbCol)==0) then
269            form='(t'//trim(int2str(pos))//            &
270                 ',"('//trim(int2str(k))//','          &
271                      //trim(int2str(j))//','          &
272                      //trim(int2str(i))//')",t'       &
273                      //trim(int2str(pos+offset))      &   
274                      //'," ---> ",g22.16,/)'
275           Pos=2
276          else
277            form='(t'//trim(int2str(pos))//            &
278                 ',"('//trim(int2str(k))//','          &
279                      //trim(int2str(j))//','          &
280                      //trim(int2str(i))//')",t'       &
281                      //trim(int2str(pos+offset))      &   
282                      //'," ---> ",g22.16," | ")'
283! d�pent de l'impl�mention, sur compaq, c'est necessaire
284!            Pos=Pos+ColumnSize
285          endif
286          write (id,form,advance='no') Field(k,j,i)
287        enddo
288        if (MOD(nb,NbCol)==0) then
289          write (id,spacing)
290        else
291          write (id,'("")')
292          write (id,spacing)
293        endif
294      enddo
295      write (id,spacing)
296    enddo
297   
298    close(id)
299 
300  end subroutine write_field3D 
301 
302  function int2str(int)
303    implicit none
304    integer, parameter :: MaxLen=10
305    integer,intent(in) :: int
306    character(len=MaxLen) :: int2str
307    logical :: flag
308    integer :: i
309    flag=.true.
310   
311    i=int
312   
313    int2str=''
314    do while (flag)
315      int2str=CHAR(MOD(i,10)+48)//int2str
316      i=i/10
317      if (i==0) flag=.false.
318    enddo
319  end function int2str
320
321end module write_field
322 
Note: See TracBrowser for help on using the repository browser.