GCC Code Coverage Report


Directory: ./
File: misc/write_field.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 113 0.0%
Branches: 0 134 0.0%

Line Branch Exec Source
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))
120 FieldIndex(NbField)=1
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
327