libsim  Versione8.0.0
vol7d_class.F90
1 ! Copyright (C) 2010 ARPA-SIM <urpsim@smr.arpa.emr.it>
2 ! authors:
3 ! Davide Cesari <dcesari@arpa.emr.it>
4 ! Paolo Patruno <ppatruno@arpa.emr.it>
5 
6 ! This program is free software; you can redistribute it and/or
7 ! modify it under the terms of the GNU General Public License as
8 ! published by the Free Software Foundation; either version 2 of
9 ! the License, or (at your option) any later version.
10 
11 ! This program is distributed in the hope that it will be useful,
12 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ! GNU General Public License for more details.
15 
16 ! You should have received a copy of the GNU General Public License
17 ! along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #include "config.h"
19 
31 
85 MODULE vol7d_class
86 USE kinds
90 USE log4fortran
91 USE err_handling
92 USE io_units
99 IMPLICIT NONE
100 
101 
102 INTEGER, PARAMETER :: vol7d_maxdim_a = 3, vol7d_maxdim_aa = 4, &
103  vol7d_maxdim_d = 6, vol7d_maxdim_ad = 7
104 
105 INTEGER, PARAMETER :: vol7d_ana_a=1
106 INTEGER, PARAMETER :: vol7d_var_a=2
107 INTEGER, PARAMETER :: vol7d_network_a=3
108 INTEGER, PARAMETER :: vol7d_attr_a=4
109 INTEGER, PARAMETER :: vol7d_ana_d=1
110 INTEGER, PARAMETER :: vol7d_time_d=2
111 INTEGER, PARAMETER :: vol7d_level_d=3
112 INTEGER, PARAMETER :: vol7d_timerange_d=4
113 INTEGER, PARAMETER :: vol7d_var_d=5
114 INTEGER, PARAMETER :: vol7d_network_d=6
115 INTEGER, PARAMETER :: vol7d_attr_d=7
116 INTEGER, PARAMETER :: vol7d_cdatalen=32
117 
118 TYPE vol7d_varmap
119  INTEGER :: r, d, i, b, c
120 END TYPE vol7d_varmap
121 
124 TYPE vol7d
126  TYPE(vol7d_ana),POINTER :: ana(:)
128  TYPE(datetime),POINTER :: time(:)
130  TYPE(vol7d_level),POINTER :: level(:)
132  TYPE(vol7d_timerange),POINTER :: timerange(:)
134  TYPE(vol7d_network),POINTER :: network(:)
136  TYPE(vol7d_varvect) :: anavar
138  TYPE(vol7d_varvect) :: anaattr
140  TYPE(vol7d_varvect) :: anavarattr
142  TYPE(vol7d_varvect) :: dativar
144  TYPE(vol7d_varvect) :: datiattr
146  TYPE(vol7d_varvect) :: dativarattr
147 
149  REAL,POINTER :: volanar(:,:,:)
151  DOUBLE PRECISION,POINTER :: volanad(:,:,:)
153  INTEGER,POINTER :: volanai(:,:,:)
155  INTEGER(kind=int_b),POINTER :: volanab(:,:,:)
157  CHARACTER(len=vol7d_cdatalen),POINTER :: volanac(:,:,:)
158 
160  REAL,POINTER :: volanaattrr(:,:,:,:)
162  DOUBLE PRECISION,POINTER :: volanaattrd(:,:,:,:)
164  INTEGER,POINTER :: volanaattri(:,:,:,:)
166  INTEGER(kind=int_b),POINTER :: volanaattrb(:,:,:,:)
168  CHARACTER(len=vol7d_cdatalen),POINTER :: volanaattrc(:,:,:,:)
169 
171  REAL,POINTER :: voldatir(:,:,:,:,:,:) ! sono i dati
173  DOUBLE PRECISION,POINTER :: voldatid(:,:,:,:,:,:)
175  INTEGER,POINTER :: voldatii(:,:,:,:,:,:)
177  INTEGER(kind=int_b),POINTER :: voldatib(:,:,:,:,:,:)
179  CHARACTER(len=vol7d_cdatalen),POINTER :: voldatic(:,:,:,:,:,:)
180 
182  REAL,POINTER :: voldatiattrr(:,:,:,:,:,:,:)
184  DOUBLE PRECISION,POINTER :: voldatiattrd(:,:,:,:,:,:,:)
186  INTEGER,POINTER :: voldatiattri(:,:,:,:,:,:,:)
188  INTEGER(kind=int_b),POINTER :: voldatiattrb(:,:,:,:,:,:,:)
190  CHARACTER(len=vol7d_cdatalen),POINTER :: voldatiattrc(:,:,:,:,:,:,:)
191 
193  integer :: time_definition
194 
195 END TYPE vol7d
196 
200 INTERFACE init
201  MODULE PROCEDURE vol7d_init
202 END INTERFACE
203 
205 INTERFACE delete
206  MODULE PROCEDURE vol7d_delete
207 END INTERFACE
208 
210 INTERFACE export
211  MODULE PROCEDURE vol7d_write_on_file
212 END INTERFACE
213 
215 INTERFACE import
216  MODULE PROCEDURE vol7d_read_from_file
217 END INTERFACE
218 
220 INTERFACE display
221  MODULE PROCEDURE vol7d_display, dat_display, dat_vect_display
222 END INTERFACE
223 
225 INTERFACE to_char
226  MODULE PROCEDURE to_char_dat
227 END INTERFACE
228 
230 INTERFACE doubledat
231  MODULE PROCEDURE doubledatd,doubledatr,doubledati,doubledatb,doubledatc
232 END INTERFACE
233 
235 INTERFACE realdat
236  MODULE PROCEDURE realdatd,realdatr,realdati,realdatb,realdatc
237 END INTERFACE
238 
240 INTERFACE integerdat
241  MODULE PROCEDURE integerdatd,integerdatr,integerdati,integerdatb,integerdatc
242 END INTERFACE
243 
245 INTERFACE copy
246  MODULE PROCEDURE vol7d_copy
247 END INTERFACE
248 
250 INTERFACE c_e
251  MODULE PROCEDURE vol7d_c_e
252 END INTERFACE
253 
257 INTERFACE check
258  MODULE PROCEDURE vol7d_check
259 END INTERFACE
260 
274 INTERFACE rounding
275  MODULE PROCEDURE v7d_rounding
276 END INTERFACE
277 
278 !!$INTERFACE get_volana
279 !!$ MODULE PROCEDURE vol7d_get_volanar, vol7d_get_volanad, vol7d_get_volanai, &
280 !!$ vol7d_get_volanab, vol7d_get_volanac
281 !!$END INTERFACE
282 !!$
283 !!$INTERFACE get_voldati
284 !!$ MODULE PROCEDURE vol7d_get_voldatir, vol7d_get_voldatid, vol7d_get_voldatii, &
285 !!$ vol7d_get_voldatib, vol7d_get_voldatic
286 !!$END INTERFACE
287 !!$
288 !!$INTERFACE get_volanaattr
289 !!$ MODULE PROCEDURE vol7d_get_volanaattrr, vol7d_get_volanaattrd, &
290 !!$ vol7d_get_volanaattri, vol7d_get_volanaattrb, vol7d_get_volanaattrc
291 !!$END INTERFACE
292 !!$
293 !!$INTERFACE get_voldatiattr
294 !!$ MODULE PROCEDURE vol7d_get_voldatiattrr, vol7d_get_voldatiattrd, &
295 !!$ vol7d_get_voldatiattri, vol7d_get_voldatiattrb, vol7d_get_voldatiattrc
296 !!$END INTERFACE
297 
298 PRIVATE vol7d_get_volr, vol7d_get_vold, vol7d_get_voli, vol7d_get_volb, &
299  vol7d_get_volc, &
300  volptr1dr, volptr2dr, volptr3dr, volptr4dr, volptr5dr, volptr6dr, volptr7dr, &
301  volptr1dd, volptr2dd, volptr3dd, volptr4dd, volptr5dd, volptr6dd, volptr7dd, &
302  volptr1di, volptr2di, volptr3di, volptr4di, volptr5di, volptr6di, volptr7di, &
303  volptr1db, volptr2db, volptr3db, volptr4db, volptr5db, volptr6db, volptr7db, &
304  volptr1dc, volptr2dc, volptr3dc, volptr4dc, volptr5dc, volptr6dc, volptr7dc, &
305  vol7d_nullifyr, vol7d_nullifyd, vol7d_nullifyi, vol7d_nullifyb, vol7d_nullifyc, &
306  vol7d_init, vol7d_delete, vol7d_write_on_file, vol7d_read_from_file, &
307  vol7d_check_alloc_ana, vol7d_force_alloc_ana, &
308  vol7d_check_alloc_dati, vol7d_force_alloc_dati, vol7d_force_alloc, &
309  vol7d_display, dat_display, dat_vect_display, &
310  to_char_dat, vol7d_check
312 PRIVATE doubledatd,doubledatr,doubledati,doubledatb,doubledatc
314 PRIVATE vol7d_c_e
315 
316 CONTAINS
317 
318 
323 SUBROUTINE vol7d_init(this,time_definition)
324 TYPE(vol7d),intent(out) :: this
325 INTEGER,INTENT(IN),OPTIONAL :: time_definition
327 CALL init(this%anavar)
328 CALL init(this%anaattr)
329 CALL init(this%anavarattr)
330 CALL init(this%dativar)
331 CALL init(this%datiattr)
332 CALL init(this%dativarattr)
333 
334 NULLIFY(this%ana, this%time, this%level, this%timerange, this%network)
335 
336 NULLIFY(this%volanar, this%volanaattrr, this%voldatir, this%voldatiattrr)
337 NULLIFY(this%volanad, this%volanaattrd, this%voldatid, this%voldatiattrd)
338 NULLIFY(this%volanai, this%volanaattri, this%voldatii, this%voldatiattri)
339 NULLIFY(this%volanab, this%volanaattrb, this%voldatib, this%voldatiattrb)
340 NULLIFY(this%volanac, this%volanaattrc, this%voldatic, this%voldatiattrc)
341 
342 if(present(time_definition)) then
343  this%time_definition=time_definition
344 else
345  this%time_definition=1 !default to validity time
346 end if
348 END SUBROUTINE vol7d_init
350 
354 ELEMENTAL SUBROUTINE vol7d_delete(this, dataonly)
355 TYPE(vol7d),intent(inout) :: this
356 LOGICAL, INTENT(in), OPTIONAL :: dataonly
357 
359 IF (.NOT. optio_log(dataonly)) THEN
360  IF (ASSOCIATED(this%volanar)) DEALLOCATE(this%volanar)
361  IF (ASSOCIATED(this%volanad)) DEALLOCATE(this%volanad)
362  IF (ASSOCIATED(this%volanai)) DEALLOCATE(this%volanai)
363  IF (ASSOCIATED(this%volanab)) DEALLOCATE(this%volanab)
364  IF (ASSOCIATED(this%volanac)) DEALLOCATE(this%volanac)
365  IF (ASSOCIATED(this%volanaattrr)) DEALLOCATE(this%volanaattrr)
366  IF (ASSOCIATED(this%volanaattrd)) DEALLOCATE(this%volanaattrd)
367  IF (ASSOCIATED(this%volanaattri)) DEALLOCATE(this%volanaattri)
368  IF (ASSOCIATED(this%volanaattrb)) DEALLOCATE(this%volanaattrb)
369  IF (ASSOCIATED(this%volanaattrc)) DEALLOCATE(this%volanaattrc)
370 ENDIF
371 IF (ASSOCIATED(this%voldatir)) DEALLOCATE(this%voldatir)
372 IF (ASSOCIATED(this%voldatid)) DEALLOCATE(this%voldatid)
373 IF (ASSOCIATED(this%voldatii)) DEALLOCATE(this%voldatii)
374 IF (ASSOCIATED(this%voldatib)) DEALLOCATE(this%voldatib)
375 IF (ASSOCIATED(this%voldatic)) DEALLOCATE(this%voldatic)
376 IF (ASSOCIATED(this%voldatiattrr)) DEALLOCATE(this%voldatiattrr)
377 IF (ASSOCIATED(this%voldatiattrd)) DEALLOCATE(this%voldatiattrd)
378 IF (ASSOCIATED(this%voldatiattri)) DEALLOCATE(this%voldatiattri)
379 IF (ASSOCIATED(this%voldatiattrb)) DEALLOCATE(this%voldatiattrb)
380 IF (ASSOCIATED(this%voldatiattrc)) DEALLOCATE(this%voldatiattrc)
381 
382 IF (.NOT. optio_log(dataonly)) THEN
383  IF (ASSOCIATED(this%ana)) DEALLOCATE(this%ana)
384  IF (ASSOCIATED(this%network)) DEALLOCATE(this%network)
385 ENDIF
386 IF (ASSOCIATED(this%time)) DEALLOCATE(this%time)
387 IF (ASSOCIATED(this%level)) DEALLOCATE(this%level)
388 IF (ASSOCIATED(this%timerange)) DEALLOCATE(this%timerange)
389 
390 IF (.NOT. optio_log(dataonly)) THEN
391  CALL delete(this%anavar)
392  CALL delete(this%anaattr)
393  CALL delete(this%anavarattr)
394 ENDIF
395 CALL delete(this%dativar)
396 CALL delete(this%datiattr)
397 CALL delete(this%dativarattr)
399 END SUBROUTINE vol7d_delete
400 
401 
402 
403 integer function vol7d_check(this)
404 TYPE(vol7d),intent(in) :: this
405 integer :: i,j,k,l,m,n
406 
407 vol7d_check=0
409 if (associated(this%voldatii)) then
410 do i = 1,size(this%voldatii,1)
411  do j = 1,size(this%voldatii,2)
412  do k = 1,size(this%voldatii,3)
413  do l = 1,size(this%voldatii,4)
414  do m = 1,size(this%voldatii,5)
415  do n = 1,size(this%voldatii,6)
416  if (this%voldatii(i,j,k,l,m,n) /= this%voldatii(i,j,k,l,m,n) ) then
417  CALL l4f_log(l4f_warn,"check: abnormal value at voldatii("&
418  //t2c(i)//","//t2c(j)//","//t2c(k)//","//t2c(l)//","//t2c(m)//","//t2c(n)//",)")
419  vol7d_check=1
420  end if
421  end do
422  end do
423  end do
424  end do
425  end do
426 end do
427 end if
429 
430 if (associated(this%voldatir)) then
431 do i = 1,size(this%voldatir,1)
432  do j = 1,size(this%voldatir,2)
433  do k = 1,size(this%voldatir,3)
434  do l = 1,size(this%voldatir,4)
435  do m = 1,size(this%voldatir,5)
436  do n = 1,size(this%voldatir,6)
437  if (this%voldatir(i,j,k,l,m,n) /= this%voldatir(i,j,k,l,m,n) ) then
438  CALL l4f_log(l4f_warn,"check: abnormal value at voldatir("&
439  //t2c(i)//","//t2c(j)//","//t2c(k)//","//t2c(l)//","//t2c(m)//","//t2c(n)//",)")
440  vol7d_check=2
441  end if
442  end do
443  end do
444  end do
445  end do
446  end do
447 end do
448 end if
449 
450 if (associated(this%voldatid)) then
451 do i = 1,size(this%voldatid,1)
452  do j = 1,size(this%voldatid,2)
453  do k = 1,size(this%voldatid,3)
454  do l = 1,size(this%voldatid,4)
455  do m = 1,size(this%voldatid,5)
456  do n = 1,size(this%voldatid,6)
457  if (this%voldatid(i,j,k,l,m,n) /= this%voldatid(i,j,k,l,m,n) ) then
458  CALL l4f_log(l4f_warn,"check: abnormal value at voldatid("&
459  //t2c(i)//","//t2c(j)//","//t2c(k)//","//t2c(l)//","//t2c(m)//","//t2c(n)//",)")
460  vol7d_check=3
461  end if
462  end do
463  end do
464  end do
465  end do
466  end do
467 end do
468 end if
469 
470 if (associated(this%voldatib)) then
471 do i = 1,size(this%voldatib,1)
472  do j = 1,size(this%voldatib,2)
473  do k = 1,size(this%voldatib,3)
474  do l = 1,size(this%voldatib,4)
475  do m = 1,size(this%voldatib,5)
476  do n = 1,size(this%voldatib,6)
477  if (this%voldatib(i,j,k,l,m,n) /= this%voldatib(i,j,k,l,m,n) ) then
478  CALL l4f_log(l4f_warn,"check: abnormal value at voldatib("&
479  //t2c(i)//","//t2c(j)//","//t2c(k)//","//t2c(l)//","//t2c(m)//","//t2c(n)//",)")
480  vol7d_check=4
481  end if
482  end do
483  end do
484  end do
485  end do
486  end do
487 end do
488 end if
489 
490 end function vol7d_check
491 
492 
493 
494 !TODO da completare ! aborta se i volumi sono allocati a dimensione 0
496 SUBROUTINE vol7d_display(this)
497 TYPE(vol7d),intent(in) :: this
498 integer :: i
499 
500 REAL :: rdat
501 DOUBLE PRECISION :: ddat
502 INTEGER :: idat
503 INTEGER(kind=int_b) :: bdat
504 CHARACTER(len=vol7d_cdatalen) :: cdat
505 
506 
507 print*,"<<<<<<<<<<<<<<<<<<< vol7d object >>>>>>>>>>>>>>>>>>>>"
508 if (this%time_definition == 0) then
509  print*,"TIME DEFINITION: time is reference time"
510 else if (this%time_definition == 1) then
511  print*,"TIME DEFINITION: time is validity time"
512 else if (this%time_definition == 2) then
513  print*,"TIME DEFINITION: time is validity time, forecast range forced to 0"
514 else
515  print*,"Time definition has a wrong walue:", this%time_definition
516 end if
517 
518 IF (ASSOCIATED(this%network))then
519  print*,"---- network vector ----"
520  print*,"elements=",size(this%network)
521  do i=1, size(this%network)
522  call display(this%network(i))
523  end do
524 end IF
525 
526 IF (ASSOCIATED(this%ana))then
527  print*,"---- ana vector ----"
528  print*,"elements=",size(this%ana)
529  do i=1, size(this%ana)
530  call display(this%ana(i))
531  end do
532 end IF
533 
534 IF (ASSOCIATED(this%time))then
535  print*,"---- time vector ----"
536  print*,"elements=",size(this%time)
537  do i=1, size(this%time)
538  call display(this%time(i))
539  end do
540 end if
541 
542 IF (ASSOCIATED(this%level)) then
543  print*,"---- level vector ----"
544  print*,"elements=",size(this%level)
545  do i =1,size(this%level)
546  call display(this%level(i))
547  end do
548 end if
549 
550 IF (ASSOCIATED(this%timerange))then
551  print*,"---- timerange vector ----"
552  print*,"elements=",size(this%timerange)
553  do i =1,size(this%timerange)
554  call display(this%timerange(i))
555  end do
556 end if
557 
558 
559 print*,"---- ana vector ----"
560 print*,""
561 print*,"->>>>>>>>> anavar -"
562 call display(this%anavar)
563 print*,""
564 print*,"->>>>>>>>> anaattr -"
565 call display(this%anaattr)
566 print*,""
567 print*,"->>>>>>>>> anavarattr -"
568 call display(this%anavarattr)
569 
570 print*,"-- ana data section (first point) --"
571 
572 idat=imiss
573 rdat=rmiss
574 ddat=dmiss
575 bdat=ibmiss
576 cdat=cmiss
577 
578 !ntime = MIN(SIZE(this%time),nprint)
579 !ntimerange = MIN(SIZE(this%timerange),nprint)
580 !nlevel = MIN(SIZE(this%level),nprint)
581 !nnetwork = MIN(SIZE(this%network),nprint)
582 !nana = MIN(SIZE(this%ana),nprint)
583 
584 IF (SIZE(this%ana) > 0 .AND. SIZE(this%network) > 0) THEN
585 if (associated(this%volanai)) then
586  do i=1,size(this%anavar%i)
587  idat=this%volanai(1,i,1)
588  if (associated(this%anavar%i)) call display(this%anavar%i(i),idat,rdat,ddat,bdat,cdat)
589  end do
590 end if
591 idat=imiss
592 
593 if (associated(this%volanar)) then
594  do i=1,size(this%anavar%r)
595  rdat=this%volanar(1,i,1)
596  if (associated(this%anavar%r)) call display(this%anavar%r(i),idat,rdat,ddat,bdat,cdat)
597  end do
598 end if
599 rdat=rmiss
600 
601 if (associated(this%volanad)) then
602  do i=1,size(this%anavar%d)
603  ddat=this%volanad(1,i,1)
604  if (associated(this%anavar%d)) call display(this%anavar%d(i),idat,rdat,ddat,bdat,cdat)
605  end do
606 end if
607 ddat=dmiss
608 
609 if (associated(this%volanab)) then
610  do i=1,size(this%anavar%b)
611  bdat=this%volanab(1,i,1)
612  if (associated(this%anavar%b)) call display(this%anavar%b(i),idat,rdat,ddat,bdat,cdat)
613  end do
614 end if
615 bdat=ibmiss
616 
617 if (associated(this%volanac)) then
618  do i=1,size(this%anavar%c)
619  cdat=this%volanac(1,i,1)
620  if (associated(this%anavar%c)) call display(this%anavar%c(i),idat,rdat,ddat,bdat,cdat)
621  end do
622 end if
623 cdat=cmiss
624 ENDIF
625 
626 print*,"---- data vector ----"
627 print*,""
628 print*,"->>>>>>>>> dativar -"
629 call display(this%dativar)
630 print*,""
631 print*,"->>>>>>>>> datiattr -"
632 call display(this%datiattr)
633 print*,""
634 print*,"->>>>>>>>> dativarattr -"
635 call display(this%dativarattr)
636 
637 print*,"-- data data section (first point) --"
638 
639 idat=imiss
640 rdat=rmiss
641 ddat=dmiss
642 bdat=ibmiss
643 cdat=cmiss
644 
645 IF (SIZE(this%ana) > 0 .AND. SIZE(this%network) > 0 .AND. size(this%time) > 0 &
646  .AND. size(this%level) > 0 .AND. size(this%timerange) > 0) THEN
647 if (associated(this%voldatii)) then
648  do i=1,size(this%dativar%i)
649  idat=this%voldatii(1,1,1,1,i,1)
650  if (associated(this%dativar%i)) call display(this%dativar%i(i),idat,rdat,ddat,bdat,cdat)
651  end do
652 end if
653 idat=imiss
654 
655 if (associated(this%voldatir)) then
656  do i=1,size(this%dativar%r)
657  rdat=this%voldatir(1,1,1,1,i,1)
658  if (associated(this%dativar%r)) call display(this%dativar%r(i),idat,rdat,ddat,bdat,cdat)
659  end do
660 end if
661 rdat=rmiss
662 
663 if (associated(this%voldatid)) then
664  do i=1,size(this%dativar%d)
665  ddat=this%voldatid(1,1,1,1,i,1)
666  if (associated(this%dativar%d)) call display(this%dativar%d(i),idat,rdat,ddat,bdat,cdat)
667  end do
668 end if
669 ddat=dmiss
670 
671 if (associated(this%voldatib)) then
672  do i=1,size(this%dativar%b)
673  bdat=this%voldatib(1,1,1,1,i,1)
674  if (associated(this%dativar%b)) call display(this%dativar%b(i),idat,rdat,ddat,bdat,cdat)
675  end do
676 end if
677 bdat=ibmiss
678 
679 if (associated(this%voldatic)) then
680  do i=1,size(this%dativar%c)
681  cdat=this%voldatic(1,1,1,1,i,1)
682  if (associated(this%dativar%c)) call display(this%dativar%c(i),idat,rdat,ddat,bdat,cdat)
683  end do
684 end if
685 cdat=cmiss
686 ENDIF
687 
688 print*,"<<<<<<<<<<<<<<<<<<< END vol7d object >>>>>>>>>>>>>>>>>>>>"
689 
690 END SUBROUTINE vol7d_display
691 
692 
694 SUBROUTINE dat_display(this,idat,rdat,ddat,bdat,cdat)
695 TYPE(vol7d_var),intent(in) :: this
697 REAL :: rdat
699 DOUBLE PRECISION :: ddat
701 INTEGER :: idat
703 INTEGER(kind=int_b) :: bdat
705 CHARACTER(len=*) :: cdat
706 
707 print *, to_char_dat(this,idat,rdat,ddat,bdat,cdat)
708 
709 end SUBROUTINE dat_display
710 
712 SUBROUTINE dat_vect_display(this,idat,rdat,ddat,bdat,cdat)
713 
714 TYPE(vol7d_var),intent(in) :: this(:)
716 REAL :: rdat(:)
718 DOUBLE PRECISION :: ddat(:)
720 INTEGER :: idat(:)
722 INTEGER(kind=int_b) :: bdat(:)
724 CHARACTER(len=*):: cdat(:)
725 
726 integer :: i
727 
728 do i =1,size(this)
729  call display(this(i),idat(i),rdat(i),ddat(i),bdat(i),cdat(i))
730 end do
731 
732 end SUBROUTINE dat_vect_display
733 
734 
735 FUNCTION to_char_dat(this,idat,rdat,ddat,bdat,cdat)
736 #ifdef HAVE_DBALLE
737 USE dballef
738 #endif
739 TYPE(vol7d_var),INTENT(in) :: this
741 REAL :: rdat
743 DOUBLE PRECISION :: ddat
745 INTEGER :: idat
747 INTEGER(kind=int_b) :: bdat
749 CHARACTER(len=*) :: cdat
750 CHARACTER(len=80) :: to_char_dat
751 
752 CHARACTER(len=LEN(to_char_dat)) :: to_char_tmp
753 
754 
755 #ifdef HAVE_DBALLE
756 INTEGER :: handle, ier
757 
758 handle = 0
759 to_char_dat="VALUE: "
760 
761 if (c_e(idat)) to_char_dat=trim(to_char_dat)//" ;int> "//trim(to_char(idat))
762 if (c_e(rdat)) to_char_dat=trim(to_char_dat)//" ;real> "//trim(to_char(rdat))
763 if (c_e(ddat)) to_char_dat=trim(to_char_dat)//" ;double> "//trim(to_char(ddat))
764 if (c_e(bdat)) to_char_dat=trim(to_char_dat)//" ;byte> "//trim(to_char(bdat))
765 
766 if ( c_e(cdat))then
767  ier = idba_messaggi(handle,"/dev/null", "w", "BUFR")
768  ier = idba_spiegab(handle,this%btable,cdat,to_char_tmp)
769  ier = idba_fatto(handle)
770  to_char_dat=trim(to_char_dat)//" ;char> "//trim(to_char_tmp)
771 endif
772 
773 #else
774 
775 to_char_dat="VALUE: "
776 if (c_e(idat)) to_char_dat=trim(to_char_dat)//" ;int> "//trim(to_char(idat))
777 if (c_e(rdat)) to_char_dat=trim(to_char_dat)//" ;real> "//trim(to_char(rdat))
778 if (c_e(ddat)) to_char_dat=trim(to_char_dat)//" ;double> "//trim(to_char(ddat))
779 if (c_e(bdat)) to_char_dat=trim(to_char_dat)//" ;byte> "//trim(to_char(bdat))
780 if (c_e(cdat)) to_char_dat=trim(to_char_dat)//" ;char> "//trim(cdat)
781 
782 #endif
783 
784 END FUNCTION to_char_dat
785 
786 
789 FUNCTION vol7d_c_e(this) RESULT(c_e)
790 TYPE(vol7d), INTENT(in) :: this
791 
792 LOGICAL :: c_e
793 
794 c_e = ASSOCIATED(this%ana) .OR. ASSOCIATED(this%time) .OR. &
795  ASSOCIATED(this%level) .OR. ASSOCIATED(this%timerange) .OR. &
796  ASSOCIATED(this%network) .OR. &
797  ASSOCIATED(this%anavar%r) .OR. ASSOCIATED(this%anavar%d) .OR. &
798  ASSOCIATED(this%anavar%i) .OR. ASSOCIATED(this%anavar%b) .OR. &
799  ASSOCIATED(this%anavar%c) .OR. &
800  ASSOCIATED(this%anaattr%r) .OR. ASSOCIATED(this%anaattr%d) .OR. &
801  ASSOCIATED(this%anaattr%i) .OR. ASSOCIATED(this%anaattr%b) .OR. &
802  ASSOCIATED(this%anaattr%c) .OR. &
803  ASSOCIATED(this%dativar%r) .OR. ASSOCIATED(this%dativar%d) .OR. &
804  ASSOCIATED(this%dativar%i) .OR. ASSOCIATED(this%dativar%b) .OR. &
805  ASSOCIATED(this%dativar%c) .OR. &
806  ASSOCIATED(this%datiattr%r) .OR. ASSOCIATED(this%datiattr%d) .OR. &
807  ASSOCIATED(this%datiattr%i) .OR. ASSOCIATED(this%datiattr%b) .OR. &
808  ASSOCIATED(this%datiattr%c)
809 
810 END FUNCTION vol7d_c_e
811 
812 
851 SUBROUTINE vol7d_alloc(this, nana, ntime, nlevel, ntimerange, nnetwork, &
852  nanavarr, nanavard, nanavari, nanavarb, nanavarc, &
853  nanaattrr, nanaattrd, nanaattri, nanaattrb, nanaattrc, &
854  nanavarattrr, nanavarattrd, nanavarattri, nanavarattrb, nanavarattrc, &
855  ndativarr, ndativard, ndativari, ndativarb, ndativarc, &
856  ndatiattrr, ndatiattrd, ndatiattri, ndatiattrb, ndatiattrc, &
857  ndativarattrr, ndativarattrd, ndativarattri, ndativarattrb, ndativarattrc, &
858  ini)
859 TYPE(vol7d),INTENT(inout) :: this
860 INTEGER,INTENT(in),OPTIONAL :: nana
861 INTEGER,INTENT(in),OPTIONAL :: ntime
862 INTEGER,INTENT(in),OPTIONAL :: nlevel
863 INTEGER,INTENT(in),OPTIONAL :: ntimerange
864 INTEGER,INTENT(in),OPTIONAL :: nnetwork
866 INTEGER,INTENT(in),OPTIONAL :: &
867  nanavarr, nanavard, nanavari, nanavarb, nanavarc, &
868  nanaattrr, nanaattrd, nanaattri, nanaattrb, nanaattrc, &
869  nanavarattrr, nanavarattrd, nanavarattri, nanavarattrb, nanavarattrc, &
870  ndativarr, ndativard, ndativari, ndativarb, ndativarc, &
871  ndatiattrr, ndatiattrd, ndatiattri, ndatiattrb, ndatiattrc, &
872  ndativarattrr, ndativarattrd, ndativarattri, ndativarattrb, ndativarattrc
873 LOGICAL,INTENT(in),OPTIONAL :: ini
874 
875 INTEGER :: i
876 LOGICAL :: linit
877 
878 IF (PRESENT(ini)) THEN
879  linit = ini
880 ELSE
881  linit = .false.
882 ENDIF
883 
884 ! Dimensioni principali
885 IF (PRESENT(nana)) THEN
886  IF (nana >= 0) THEN
887  IF (ASSOCIATED(this%ana)) DEALLOCATE(this%ana)
888  ALLOCATE(this%ana(nana))
889  IF (linit) THEN
890  DO i = 1, nana
891  CALL init(this%ana(i))
892  ENDDO
893  ENDIF
894  ENDIF
895 ENDIF
896 IF (PRESENT(ntime)) THEN
897  IF (ntime >= 0) THEN
898  IF (ASSOCIATED(this%time)) DEALLOCATE(this%time)
899  ALLOCATE(this%time(ntime))
900  IF (linit) THEN
901  DO i = 1, ntime
902  CALL init(this%time(i))
903  ENDDO
904  ENDIF
905  ENDIF
906 ENDIF
907 IF (PRESENT(nlevel)) THEN
908  IF (nlevel >= 0) THEN
909  IF (ASSOCIATED(this%level)) DEALLOCATE(this%level)
910  ALLOCATE(this%level(nlevel))
911  IF (linit) THEN
912  DO i = 1, nlevel
913  CALL init(this%level(i))
914  ENDDO
915  ENDIF
916  ENDIF
917 ENDIF
918 IF (PRESENT(ntimerange)) THEN
919  IF (ntimerange >= 0) THEN
920  IF (ASSOCIATED(this%timerange)) DEALLOCATE(this%timerange)
921  ALLOCATE(this%timerange(ntimerange))
922  IF (linit) THEN
923  DO i = 1, ntimerange
924  CALL init(this%timerange(i))
925  ENDDO
926  ENDIF
927  ENDIF
928 ENDIF
929 IF (PRESENT(nnetwork)) THEN
930  IF (nnetwork >= 0) THEN
931  IF (ASSOCIATED(this%network)) DEALLOCATE(this%network)
932  ALLOCATE(this%network(nnetwork))
933  IF (linit) THEN
934  DO i = 1, nnetwork
935  CALL init(this%network(i))
936  ENDDO
937  ENDIF
938  ENDIF
939 ENDIF
940 ! Dimensioni dei tipi delle variabili
941 CALL vol7d_varvect_alloc(this%anavar, nanavarr, nanavard, &
942  nanavari, nanavarb, nanavarc, ini)
943 CALL vol7d_varvect_alloc(this%anaattr, nanaattrr, nanaattrd, &
944  nanaattri, nanaattrb, nanaattrc, ini)
945 CALL vol7d_varvect_alloc(this%anavarattr, nanavarattrr, nanavarattrd, &
946  nanavarattri, nanavarattrb, nanavarattrc, ini)
947 CALL vol7d_varvect_alloc(this%dativar, ndativarr, ndativard, &
948  ndativari, ndativarb, ndativarc, ini)
949 CALL vol7d_varvect_alloc(this%datiattr, ndatiattrr, ndatiattrd, &
950  ndatiattri, ndatiattrb, ndatiattrc, ini)
951 CALL vol7d_varvect_alloc(this%dativarattr, ndativarattrr, ndativarattrd, &
952  ndativarattri, ndativarattrb, ndativarattrc, ini)
953 
954 END SUBROUTINE vol7d_alloc
955 
956 
957 FUNCTION vol7d_check_alloc_ana(this)
958 TYPE(vol7d),INTENT(in) :: this
959 LOGICAL :: vol7d_check_alloc_ana
960 
961 vol7d_check_alloc_ana = ASSOCIATED(this%ana) .AND. ASSOCIATED(this%network)
962 
963 END FUNCTION vol7d_check_alloc_ana
964 
965 SUBROUTINE vol7d_force_alloc_ana(this, ini)
966 TYPE(vol7d),INTENT(inout) :: this
967 LOGICAL,INTENT(in),OPTIONAL :: ini
968 
969 ! Alloco i descrittori minimi per avere un volume di anagrafica
970 IF (.NOT. ASSOCIATED(this%ana)) CALL vol7d_alloc(this, nana=1, ini=ini)
971 IF (.NOT. ASSOCIATED(this%network)) CALL vol7d_alloc(this, nnetwork=1, ini=ini)
972 
973 END SUBROUTINE vol7d_force_alloc_ana
974 
975 
976 FUNCTION vol7d_check_alloc_dati(this)
977 TYPE(vol7d),INTENT(in) :: this
978 LOGICAL :: vol7d_check_alloc_dati
980 vol7d_check_alloc_dati = vol7d_check_alloc_ana(this) .AND. &
981  ASSOCIATED(this%time) .AND. ASSOCIATED(this%level) .AND. &
982  ASSOCIATED(this%timerange)
983 
984 END FUNCTION vol7d_check_alloc_dati
985 
986 SUBROUTINE vol7d_force_alloc_dati(this, ini)
987 TYPE(vol7d),INTENT(inout) :: this
988 LOGICAL,INTENT(in),OPTIONAL :: ini
989 
990 ! Alloco i descrittori minimi per avere un volume di dati
991 CALL vol7d_force_alloc_ana(this, ini)
992 IF (.NOT. ASSOCIATED(this%time)) CALL vol7d_alloc(this, ntime=1, ini=ini)
993 IF (.NOT. ASSOCIATED(this%level)) CALL vol7d_alloc(this, nlevel=1, ini=ini)
994 IF (.NOT. ASSOCIATED(this%timerange)) CALL vol7d_alloc(this, ntimerange=1, ini=ini)
995 
996 END SUBROUTINE vol7d_force_alloc_dati
997 
998 
999 SUBROUTINE vol7d_force_alloc(this)
1000 TYPE(vol7d),INTENT(inout) :: this
1001 
1002 ! If anything really not allocated yet, allocate with size 0
1003 IF (.NOT. ASSOCIATED(this%ana)) CALL vol7d_alloc(this, nana=0)
1004 IF (.NOT. ASSOCIATED(this%network)) CALL vol7d_alloc(this, nnetwork=0)
1005 IF (.NOT. ASSOCIATED(this%time)) CALL vol7d_alloc(this, ntime=0)
1006 IF (.NOT. ASSOCIATED(this%level)) CALL vol7d_alloc(this, nlevel=0)
1007 IF (.NOT. ASSOCIATED(this%timerange)) CALL vol7d_alloc(this, ntimerange=0)
1008 
1009 END SUBROUTINE vol7d_force_alloc
1010 
1011 
1012 FUNCTION vol7d_check_vol(this)
1013 TYPE(vol7d),INTENT(in) :: this
1014 LOGICAL :: vol7d_check_vol
1015 
1016 vol7d_check_vol = c_e(this)
1017 
1018 ! Anagrafica
1019 IF (ASSOCIATED(this%anavar%r) .AND. .NOT.ASSOCIATED(this%volanar)) THEN
1020  vol7d_check_vol = .false.
1021 ENDIF
1022 
1023 IF (ASSOCIATED(this%anavar%d) .AND. .NOT.ASSOCIATED(this%volanad)) THEN
1024  vol7d_check_vol = .false.
1025 ENDIF
1026 
1027 IF (ASSOCIATED(this%anavar%i) .AND. .NOT.ASSOCIATED(this%volanai)) THEN
1028  vol7d_check_vol = .false.
1029 ENDIF
1030 
1031 IF (ASSOCIATED(this%anavar%b) .AND. .NOT.ASSOCIATED(this%volanab)) THEN
1032  vol7d_check_vol = .false.
1033 ENDIF
1034 
1035 IF (ASSOCIATED(this%anavar%c) .AND. .NOT.ASSOCIATED(this%volanac)) THEN
1036  vol7d_check_vol = .false.
1037 ENDIF
1038 IF (ASSOCIATED(this%anavar%r) .OR. ASSOCIATED(this%anavar%d) .OR. &
1039  ASSOCIATED(this%anavar%i) .OR. ASSOCIATED(this%anavar%b) .OR. &
1040  ASSOCIATED(this%anavar%c)) THEN
1041  vol7d_check_vol = vol7d_check_vol .AND. vol7d_check_alloc_ana(this)
1042 ENDIF
1043 
1044 ! Attributi dell'anagrafica
1045 IF (ASSOCIATED(this%anaattr%r) .AND. ASSOCIATED(this%anavarattr%r) .AND. &
1046  .NOT.ASSOCIATED(this%volanaattrr)) THEN
1047  vol7d_check_vol = .false.
1048 ENDIF
1049 
1050 IF (ASSOCIATED(this%anaattr%d) .AND. ASSOCIATED(this%anavarattr%d) .AND. &
1051  .NOT.ASSOCIATED(this%volanaattrd)) THEN
1052  vol7d_check_vol = .false.
1053 ENDIF
1054 
1055 IF (ASSOCIATED(this%anaattr%i) .AND. ASSOCIATED(this%anavarattr%i) .AND. &
1056  .NOT.ASSOCIATED(this%volanaattri)) THEN
1057  vol7d_check_vol = .false.
1058 ENDIF
1059 
1060 IF (ASSOCIATED(this%anaattr%b) .AND. ASSOCIATED(this%anavarattr%b) .AND. &
1061  .NOT.ASSOCIATED(this%volanaattrb)) THEN
1062  vol7d_check_vol = .false.
1063 ENDIF
1064 
1065 IF (ASSOCIATED(this%anaattr%c) .AND. ASSOCIATED(this%anavarattr%c) .AND. &
1066  .NOT.ASSOCIATED(this%volanaattrc)) THEN
1067  vol7d_check_vol = .false.
1068 ENDIF
1069 
1070 ! Dati
1071 IF (ASSOCIATED(this%dativar%r) .AND. .NOT.ASSOCIATED(this%voldatir)) THEN
1072  vol7d_check_vol = .false.
1073 ENDIF
1074 
1075 IF (ASSOCIATED(this%dativar%d) .AND. .NOT.ASSOCIATED(this%voldatid)) THEN
1076  vol7d_check_vol = .false.
1077 ENDIF
1078 
1079 IF (ASSOCIATED(this%dativar%i) .AND. .NOT.ASSOCIATED(this%voldatii)) THEN
1080  vol7d_check_vol = .false.
1081 ENDIF
1082 
1083 IF (ASSOCIATED(this%dativar%b) .AND. .NOT.ASSOCIATED(this%voldatib)) THEN
1084  vol7d_check_vol = .false.
1085 ENDIF
1086 
1087 IF (ASSOCIATED(this%dativar%c) .AND. .NOT.ASSOCIATED(this%voldatic)) THEN
1088  vol7d_check_vol = .false.
1089 ENDIF
1090 
1091 ! Attributi dei dati
1092 IF (ASSOCIATED(this%datiattr%r) .AND. ASSOCIATED(this%dativarattr%r) .AND. &
1093  .NOT.ASSOCIATED(this%voldatiattrr)) THEN
1094  vol7d_check_vol = .false.
1095 ENDIF
1096 
1097 IF (ASSOCIATED(this%datiattr%d) .AND. ASSOCIATED(this%dativarattr%d) .AND. &
1098  .NOT.ASSOCIATED(this%voldatiattrd)) THEN
1099  vol7d_check_vol = .false.
1100 ENDIF
1101 
1102 IF (ASSOCIATED(this%datiattr%i) .AND. ASSOCIATED(this%dativarattr%i) .AND. &
1103  .NOT.ASSOCIATED(this%voldatiattri)) THEN
1104  vol7d_check_vol = .false.
1105 ENDIF
1106 
1107 IF (ASSOCIATED(this%datiattr%b) .AND. ASSOCIATED(this%dativarattr%b) .AND. &
1108  .NOT.ASSOCIATED(this%voldatiattrb)) THEN
1109  vol7d_check_vol = .false.
1110 ENDIF
1111 
1112 IF (ASSOCIATED(this%datiattr%c) .AND. ASSOCIATED(this%dativarattr%c) .AND. &
1113  .NOT.ASSOCIATED(this%voldatiattrc)) THEN
1114  vol7d_check_vol = .false.
1115 ENDIF
1116 IF (ASSOCIATED(this%dativar%r) .OR. ASSOCIATED(this%dativar%d) .OR. &
1117  ASSOCIATED(this%dativar%i) .OR. ASSOCIATED(this%dativar%b) .OR. &
1118  ASSOCIATED(this%dativar%c)) THEN
1119  vol7d_check_vol = vol7d_check_vol .AND. vol7d_check_alloc_dati(this)
1120 ENDIF
1121 
1122 END FUNCTION vol7d_check_vol
1123 
1124 
1139 SUBROUTINE vol7d_alloc_vol(this, ini, inivol)
1140 TYPE(vol7d),INTENT(inout) :: this
1141 LOGICAL,INTENT(in),OPTIONAL :: ini
1142 LOGICAL,INTENT(in),OPTIONAL :: inivol
1143 
1144 LOGICAL :: linivol
1145 
1146 IF (PRESENT(inivol)) THEN
1147  linivol = inivol
1148 ELSE
1149  linivol = .true.
1150 ENDIF
1151 
1152 ! Anagrafica
1153 IF (ASSOCIATED(this%anavar%r) .AND. .NOT.ASSOCIATED(this%volanar)) THEN
1154  CALL vol7d_force_alloc_ana(this, ini)
1155  ALLOCATE(this%volanar(SIZE(this%ana), SIZE(this%anavar%r), SIZE(this%network)))
1156  IF (linivol) this%volanar(:,:,:) = rmiss
1157 ENDIF
1158 
1159 IF (ASSOCIATED(this%anavar%d) .AND. .NOT.ASSOCIATED(this%volanad)) THEN
1160  CALL vol7d_force_alloc_ana(this, ini)
1161  ALLOCATE(this%volanad(SIZE(this%ana), SIZE(this%anavar%d), SIZE(this%network)))
1162  IF (linivol) this%volanad(:,:,:) = rdmiss
1163 ENDIF
1164 
1165 IF (ASSOCIATED(this%anavar%i) .AND. .NOT.ASSOCIATED(this%volanai)) THEN
1166  CALL vol7d_force_alloc_ana(this, ini)
1167  ALLOCATE(this%volanai(SIZE(this%ana), SIZE(this%anavar%i), SIZE(this%network)))
1168  IF (linivol) this%volanai(:,:,:) = imiss
1169 ENDIF
1170 
1171 IF (ASSOCIATED(this%anavar%b) .AND. .NOT.ASSOCIATED(this%volanab)) THEN
1172  CALL vol7d_force_alloc_ana(this, ini)
1173  ALLOCATE(this%volanab(SIZE(this%ana), SIZE(this%anavar%b), SIZE(this%network)))
1174  IF (linivol) this%volanab(:,:,:) = ibmiss
1175 ENDIF
1176 
1177 IF (ASSOCIATED(this%anavar%c) .AND. .NOT.ASSOCIATED(this%volanac)) THEN
1178  CALL vol7d_force_alloc_ana(this, ini)
1179  ALLOCATE(this%volanac(SIZE(this%ana), SIZE(this%anavar%c), SIZE(this%network)))
1180  IF (linivol) this%volanac(:,:,:) = cmiss
1181 ENDIF
1182 
1183 ! Attributi dell'anagrafica
1184 IF (ASSOCIATED(this%anaattr%r) .AND. ASSOCIATED(this%anavarattr%r) .AND. &
1185  .NOT.ASSOCIATED(this%volanaattrr)) THEN
1186  CALL vol7d_force_alloc_ana(this, ini)
1187  ALLOCATE(this%volanaattrr(SIZE(this%ana), SIZE(this%anavarattr%r), &
1188  SIZE(this%network), SIZE(this%anaattr%r)))
1189  IF (linivol) this%volanaattrr(:,:,:,:) = rmiss
1190 ENDIF
1191 
1192 IF (ASSOCIATED(this%anaattr%d) .AND. ASSOCIATED(this%anavarattr%d) .AND. &
1193  .NOT.ASSOCIATED(this%volanaattrd)) THEN
1194  CALL vol7d_force_alloc_ana(this, ini)
1195  ALLOCATE(this%volanaattrd(SIZE(this%ana), SIZE(this%anavarattr%d), &
1196  SIZE(this%network), SIZE(this%anaattr%d)))
1197  IF (linivol) this%volanaattrd(:,:,:,:) = rdmiss
1198 ENDIF
1199 
1200 IF (ASSOCIATED(this%anaattr%i) .AND. ASSOCIATED(this%anavarattr%i) .AND. &
1201  .NOT.ASSOCIATED(this%volanaattri)) THEN
1202  CALL vol7d_force_alloc_ana(this, ini)
1203  ALLOCATE(this%volanaattri(SIZE(this%ana), SIZE(this%anavarattr%i), &
1204  SIZE(this%network), SIZE(this%anaattr%i)))
1205  IF (linivol) this%volanaattri(:,:,:,:) = imiss
1206 ENDIF
1207 
1208 IF (ASSOCIATED(this%anaattr%b) .AND. ASSOCIATED(this%anavarattr%b) .AND. &
1209  .NOT.ASSOCIATED(this%volanaattrb)) THEN
1210  CALL vol7d_force_alloc_ana(this, ini)
1211  ALLOCATE(this%volanaattrb(SIZE(this%ana), SIZE(this%anavarattr%b), &
1212  SIZE(this%network), SIZE(this%anaattr%b)))
1213  IF (linivol) this%volanaattrb(:,:,:,:) = ibmiss
1214 ENDIF
1215 
1216 IF (ASSOCIATED(this%anaattr%c) .AND. ASSOCIATED(this%anavarattr%c) .AND. &
1217  .NOT.ASSOCIATED(this%volanaattrc)) THEN
1218  CALL vol7d_force_alloc_ana(this, ini)
1219  ALLOCATE(this%volanaattrc(SIZE(this%ana), SIZE(this%anavarattr%c), &
1220  SIZE(this%network), SIZE(this%anaattr%c)))
1221  IF (linivol) this%volanaattrc(:,:,:,:) = cmiss
1222 ENDIF
1223 
1224 ! Dati
1225 IF (ASSOCIATED(this%dativar%r) .AND. .NOT.ASSOCIATED(this%voldatir)) THEN
1226  CALL vol7d_force_alloc_dati(this, ini)
1227  ALLOCATE(this%voldatir(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1228  SIZE(this%timerange), SIZE(this%dativar%r), SIZE(this%network)))
1229  IF (linivol) this%voldatir(:,:,:,:,:,:) = rmiss
1230 ENDIF
1231 
1232 IF (ASSOCIATED(this%dativar%d) .AND. .NOT.ASSOCIATED(this%voldatid)) THEN
1233  CALL vol7d_force_alloc_dati(this, ini)
1234  ALLOCATE(this%voldatid(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1235  SIZE(this%timerange), SIZE(this%dativar%d), SIZE(this%network)))
1236  IF (linivol) this%voldatid(:,:,:,:,:,:) = rdmiss
1237 ENDIF
1238 
1239 IF (ASSOCIATED(this%dativar%i) .AND. .NOT.ASSOCIATED(this%voldatii)) THEN
1240  CALL vol7d_force_alloc_dati(this, ini)
1241  ALLOCATE(this%voldatii(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1242  SIZE(this%timerange), SIZE(this%dativar%i), SIZE(this%network)))
1243  IF (linivol) this%voldatii(:,:,:,:,:,:) = imiss
1244 ENDIF
1245 
1246 IF (ASSOCIATED(this%dativar%b) .AND. .NOT.ASSOCIATED(this%voldatib)) THEN
1247  CALL vol7d_force_alloc_dati(this, ini)
1248  ALLOCATE(this%voldatib(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1249  SIZE(this%timerange), SIZE(this%dativar%b), SIZE(this%network)))
1250  IF (linivol) this%voldatib(:,:,:,:,:,:) = ibmiss
1251 ENDIF
1252 
1253 IF (ASSOCIATED(this%dativar%c) .AND. .NOT.ASSOCIATED(this%voldatic)) THEN
1254  CALL vol7d_force_alloc_dati(this, ini)
1255  ALLOCATE(this%voldatic(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1256  SIZE(this%timerange), SIZE(this%dativar%c), SIZE(this%network)))
1257  IF (linivol) this%voldatic(:,:,:,:,:,:) = cmiss
1258 ENDIF
1259 
1260 ! Attributi dei dati
1261 IF (ASSOCIATED(this%datiattr%r) .AND. ASSOCIATED(this%dativarattr%r) .AND. &
1262  .NOT.ASSOCIATED(this%voldatiattrr)) THEN
1263  CALL vol7d_force_alloc_dati(this, ini)
1264  ALLOCATE(this%voldatiattrr(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1265  SIZE(this%timerange), SIZE(this%dativarattr%r), SIZE(this%network), &
1266  SIZE(this%datiattr%r)))
1267  IF (linivol) this%voldatiattrr(:,:,:,:,:,:,:) = rmiss
1268 ENDIF
1269 
1270 IF (ASSOCIATED(this%datiattr%d) .AND. ASSOCIATED(this%dativarattr%d) .AND. &
1271  .NOT.ASSOCIATED(this%voldatiattrd)) THEN
1272  CALL vol7d_force_alloc_dati(this, ini)
1273  ALLOCATE(this%voldatiattrd(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1274  SIZE(this%timerange), SIZE(this%dativarattr%d), SIZE(this%network), &
1275  SIZE(this%datiattr%d)))
1276  IF (linivol) this%voldatiattrd(:,:,:,:,:,:,:) = rdmiss
1277 ENDIF
1278 
1279 IF (ASSOCIATED(this%datiattr%i) .AND. ASSOCIATED(this%dativarattr%i) .AND. &
1280  .NOT.ASSOCIATED(this%voldatiattri)) THEN
1281  CALL vol7d_force_alloc_dati(this, ini)
1282  ALLOCATE(this%voldatiattri(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1283  SIZE(this%timerange), SIZE(this%dativarattr%i), SIZE(this%network), &
1284  SIZE(this%datiattr%i)))
1285  IF (linivol) this%voldatiattri(:,:,:,:,:,:,:) = imiss
1286 ENDIF
1287 
1288 IF (ASSOCIATED(this%datiattr%b) .AND. ASSOCIATED(this%dativarattr%b) .AND. &
1289  .NOT.ASSOCIATED(this%voldatiattrb)) THEN
1290  CALL vol7d_force_alloc_dati(this, ini)
1291  ALLOCATE(this%voldatiattrb(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1292  SIZE(this%timerange), SIZE(this%dativarattr%b), SIZE(this%network), &
1293  SIZE(this%datiattr%b)))
1294  IF (linivol) this%voldatiattrb(:,:,:,:,:,:,:) = ibmiss
1295 ENDIF
1296 
1297 IF (ASSOCIATED(this%datiattr%c) .AND. ASSOCIATED(this%dativarattr%c) .AND. &
1298  .NOT.ASSOCIATED(this%voldatiattrc)) THEN
1299  CALL vol7d_force_alloc_dati(this, ini)
1300  ALLOCATE(this%voldatiattrc(SIZE(this%ana), SIZE(this%time), SIZE(this%level), &
1301  SIZE(this%timerange), SIZE(this%dativarattr%c), SIZE(this%network), &
1302  SIZE(this%datiattr%c)))
1303  IF (linivol) this%voldatiattrc(:,:,:,:,:,:,:) = cmiss
1304 ENDIF
1305 
1306 ! Catch-all method
1307 CALL vol7d_force_alloc(this)
1308 
1309 ! Creo gli indici var-attr
1310 
1311 #ifdef DEBUG
1312 CALL l4f_log(l4f_debug,"calling: vol7d_set_attr_ind")
1313 #endif
1314 
1315 CALL vol7d_set_attr_ind(this)
1316 
1317 
1318 
1319 END SUBROUTINE vol7d_alloc_vol
1320 
1321 
1328 SUBROUTINE vol7d_set_attr_ind(this)
1329 TYPE(vol7d),INTENT(inout) :: this
1330 
1331 INTEGER :: i
1332 
1333 ! real
1334 IF (ASSOCIATED(this%dativar%r)) THEN
1335  IF (ASSOCIATED(this%dativarattr%r)) THEN
1336  DO i = 1, SIZE(this%dativar%r)
1337  this%dativar%r(i)%r = &
1338  firsttrue(this%dativar%r(i)%btable == this%dativarattr%r(:)%btable)
1339  ENDDO
1340  ENDIF
1341 
1342  IF (ASSOCIATED(this%dativarattr%d)) THEN
1343  DO i = 1, SIZE(this%dativar%r)
1344  this%dativar%r(i)%d = &
1345  firsttrue(this%dativar%r(i)%btable == this%dativarattr%d(:)%btable)
1346  ENDDO
1347  ENDIF
1348 
1349  IF (ASSOCIATED(this%dativarattr%i)) THEN
1350  DO i = 1, SIZE(this%dativar%r)
1351  this%dativar%r(i)%i = &
1352  firsttrue(this%dativar%r(i)%btable == this%dativarattr%i(:)%btable)
1353  ENDDO
1354  ENDIF
1355 
1356  IF (ASSOCIATED(this%dativarattr%b)) THEN
1357  DO i = 1, SIZE(this%dativar%r)
1358  this%dativar%r(i)%b = &
1359  firsttrue(this%dativar%r(i)%btable == this%dativarattr%b(:)%btable)
1360  ENDDO
1361  ENDIF
1362 
1363  IF (ASSOCIATED(this%dativarattr%c)) THEN
1364  DO i = 1, SIZE(this%dativar%r)
1365  this%dativar%r(i)%c = &
1366  firsttrue(this%dativar%r(i)%btable == this%dativarattr%c(:)%btable)
1367  ENDDO
1368  ENDIF
1369 ENDIF
1370 ! double
1371 IF (ASSOCIATED(this%dativar%d)) THEN
1372  IF (ASSOCIATED(this%dativarattr%r)) THEN
1373  DO i = 1, SIZE(this%dativar%d)
1374  this%dativar%d(i)%r = &
1375  firsttrue(this%dativar%d(i)%btable == this%dativarattr%r(:)%btable)
1376  ENDDO
1377  ENDIF
1378 
1379  IF (ASSOCIATED(this%dativarattr%d)) THEN
1380  DO i = 1, SIZE(this%dativar%d)
1381  this%dativar%d(i)%d = &
1382  firsttrue(this%dativar%d(i)%btable == this%dativarattr%d(:)%btable)
1383  ENDDO
1384  ENDIF
1385 
1386  IF (ASSOCIATED(this%dativarattr%i)) THEN
1387  DO i = 1, SIZE(this%dativar%d)
1388  this%dativar%d(i)%i = &
1389  firsttrue(this%dativar%d(i)%btable == this%dativarattr%i(:)%btable)
1390  ENDDO
1391  ENDIF
1392 
1393  IF (ASSOCIATED(this%dativarattr%b)) THEN
1394  DO i = 1, SIZE(this%dativar%d)
1395  this%dativar%d(i)%b = &
1396  firsttrue(this%dativar%d(i)%btable == this%dativarattr%b(:)%btable)
1397  ENDDO
1398  ENDIF
1399 
1400  IF (ASSOCIATED(this%dativarattr%c)) THEN
1401  DO i = 1, SIZE(this%dativar%d)
1402  this%dativar%d(i)%c = &
1403  firsttrue(this%dativar%d(i)%btable == this%dativarattr%c(:)%btable)
1404  ENDDO
1405  ENDIF
1406 ENDIF
1407 ! integer
1408 IF (ASSOCIATED(this%dativar%i)) THEN
1409  IF (ASSOCIATED(this%dativarattr%r)) THEN
1410  DO i = 1, SIZE(this%dativar%i)
1411  this%dativar%i(i)%r = &
1412  firsttrue(this%dativar%i(i)%btable == this%dativarattr%r(:)%btable)
1413  ENDDO
1414  ENDIF
1415 
1416  IF (ASSOCIATED(this%dativarattr%d)) THEN
1417  DO i = 1, SIZE(this%dativar%i)
1418  this%dativar%i(i)%d = &
1419  firsttrue(this%dativar%i(i)%btable == this%dativarattr%d(:)%btable)
1420  ENDDO
1421  ENDIF
1422 
1423  IF (ASSOCIATED(this%dativarattr%i)) THEN
1424  DO i = 1, SIZE(this%dativar%i)
1425  this%dativar%i(i)%i = &
1426  firsttrue(this%dativar%i(i)%btable == this%dativarattr%i(:)%btable)
1427  ENDDO
1428  ENDIF
1429 
1430  IF (ASSOCIATED(this%dativarattr%b)) THEN
1431  DO i = 1, SIZE(this%dativar%i)
1432  this%dativar%i(i)%b = &
1433  firsttrue(this%dativar%i(i)%btable == this%dativarattr%b(:)%btable)
1434  ENDDO
1435  ENDIF
1436 
1437  IF (ASSOCIATED(this%dativarattr%c)) THEN
1438  DO i = 1, SIZE(this%dativar%i)
1439  this%dativar%i(i)%c = &
1440  firsttrue(this%dativar%i(i)%btable == this%dativarattr%c(:)%btable)
1441  ENDDO
1442  ENDIF
1443 ENDIF
1444 ! byte
1445 IF (ASSOCIATED(this%dativar%b)) THEN
1446  IF (ASSOCIATED(this%dativarattr%r)) THEN
1447  DO i = 1, SIZE(this%dativar%b)
1448  this%dativar%b(i)%r = &
1449  firsttrue(this%dativar%b(i)%btable == this%dativarattr%r(:)%btable)
1450  ENDDO
1451  ENDIF
1452 
1453  IF (ASSOCIATED(this%dativarattr%d)) THEN
1454  DO i = 1, SIZE(this%dativar%b)
1455  this%dativar%b(i)%d = &
1456  firsttrue(this%dativar%b(i)%btable == this%dativarattr%d(:)%btable)
1457  ENDDO
1458  ENDIF
1459 
1460  IF (ASSOCIATED(this%dativarattr%i)) THEN
1461  DO i = 1, SIZE(this%dativar%b)
1462  this%dativar%b(i)%i = &
1463  firsttrue(this%dativar%b(i)%btable == this%dativarattr%i(:)%btable)
1464  ENDDO
1465  ENDIF
1466 
1467  IF (ASSOCIATED(this%dativarattr%b)) THEN
1468  DO i = 1, SIZE(this%dativar%b)
1469  this%dativar%b(i)%b = &
1470  firsttrue(this%dativar%b(i)%btable == this%dativarattr%b(:)%btable)
1471  ENDDO
1472  ENDIF
1473 
1474  IF (ASSOCIATED(this%dativarattr%c)) THEN
1475  DO i = 1, SIZE(this%dativar%b)
1476  this%dativar%b(i)%c = &
1477  firsttrue(this%dativar%b(i)%btable == this%dativarattr%c(:)%btable)
1478  ENDDO
1479  ENDIF
1480 ENDIF
1481 ! character
1482 IF (ASSOCIATED(this%dativar%c)) THEN
1483  IF (ASSOCIATED(this%dativarattr%r)) THEN
1484  DO i = 1, SIZE(this%dativar%c)
1485  this%dativar%c(i)%r = &
1486  firsttrue(this%dativar%c(i)%btable == this%dativarattr%r(:)%btable)
1487  ENDDO
1488  ENDIF
1489 
1490  IF (ASSOCIATED(this%dativarattr%d)) THEN
1491  DO i = 1, SIZE(this%dativar%c)
1492  this%dativar%c(i)%d = &
1493  firsttrue(this%dativar%c(i)%btable == this%dativarattr%d(:)%btable)
1494  ENDDO
1495  ENDIF
1496 
1497  IF (ASSOCIATED(this%dativarattr%i)) THEN
1498  DO i = 1, SIZE(this%dativar%c)
1499  this%dativar%c(i)%i = &
1500  firsttrue(this%dativar%c(i)%btable == this%dativarattr%i(:)%btable)
1501  ENDDO
1502  ENDIF
1503 
1504  IF (ASSOCIATED(this%dativarattr%b)) THEN
1505  DO i = 1, SIZE(this%dativar%c)
1506  this%dativar%c(i)%b = &
1507  firsttrue(this%dativar%c(i)%btable == this%dativarattr%b(:)%btable)
1508  ENDDO
1509  ENDIF
1510 
1511  IF (ASSOCIATED(this%dativarattr%c)) THEN
1512  DO i = 1, SIZE(this%dativar%c)
1513  this%dativar%c(i)%c = &
1514  firsttrue(this%dativar%c(i)%btable == this%dativarattr%c(:)%btable)
1515  ENDDO
1516  ENDIF
1517 ENDIF
1519 END SUBROUTINE vol7d_set_attr_ind
1520 
1521 
1526 SUBROUTINE vol7d_merge(this, that, sort, bestdata, &
1527  ltimesimple, ltimerangesimple, llevelsimple, lanasimple)
1528 TYPE(vol7d),INTENT(INOUT) :: this
1529 TYPE(vol7d),INTENT(INOUT) :: that
1530 LOGICAL,INTENT(IN),OPTIONAL :: sort
1531 LOGICAL,INTENT(in),OPTIONAL :: bestdata
1532 LOGICAL,INTENT(IN),OPTIONAL :: ltimesimple, ltimerangesimple, llevelsimple, lanasimple ! experimental, please do not use outside the library now
1533 
1534 TYPE(vol7d) :: v7d_clean
1535 
1536 
1537 IF (.NOT.c_e(this)) THEN ! speedup
1538  this = that
1539  CALL init(v7d_clean)
1540  that = v7d_clean ! destroy that without deallocating
1541 ELSE ! Append that to this and destroy that
1542  CALL vol7d_append(this, that, sort, bestdata, &
1543  ltimesimple, ltimerangesimple, llevelsimple, lanasimple)
1544  CALL delete(that)
1545 ENDIF
1546 
1547 END SUBROUTINE vol7d_merge
1548 
1549 
1578 SUBROUTINE vol7d_append(this, that, sort, bestdata, &
1579  ltimesimple, ltimerangesimple, llevelsimple, lanasimple, lnetworksimple)
1580 TYPE(vol7d),INTENT(INOUT) :: this
1581 TYPE(vol7d),INTENT(IN) :: that
1582 LOGICAL,INTENT(IN),OPTIONAL :: sort
1583 ! experimental, please do not use outside the library now, they force the use
1584 ! of a simplified mapping algorithm which is valid only whene the dimension
1585 ! content is the same in both volumes , or when one of them is empty
1586 LOGICAL,INTENT(in),OPTIONAL :: bestdata
1587 LOGICAL,INTENT(IN),OPTIONAL :: ltimesimple, ltimerangesimple, llevelsimple, lanasimple, lnetworksimple
1588 
1589 
1590 TYPE(vol7d) :: v7dtmp
1591 LOGICAL :: lsort, lbestdata
1592 INTEGER,POINTER :: remapt1(:), remapt2(:), remaptr1(:), remaptr2(:), &
1593  remapl1(:), remapl2(:), remapa1(:), remapa2(:), remapn1(:), remapn2(:)
1594 
1595 IF (.NOT.c_e(that)) RETURN ! speedup, nothing to do
1596 IF (.NOT.vol7d_check_vol(that)) RETURN ! be safe
1597 IF (.NOT.c_e(this)) THEN ! this case is like a vol7d_copy, more efficient to copy?
1598  CALL vol7d_copy(that, this, sort=sort)
1599  RETURN
1600 ENDIF
1601 
1602 IF (this%time_definition /= that%time_definition) THEN
1603  CALL l4f_log(l4f_fatal, &
1604  'in vol7d_append, cannot append volumes with different &
1605  &time definition')
1606  CALL raise_fatal_error()
1607 ENDIF
1608 
1609 ! Completo l'allocazione per avere volumi a norma
1610 CALL vol7d_alloc_vol(this)
1611 
1612 CALL init(v7dtmp, time_definition=this%time_definition)
1613 CALL optio(sort, lsort)
1614 CALL optio(bestdata, lbestdata)
1615 
1616 ! Calcolo le mappature tra volumi vecchi e volume nuovo
1617 ! I puntatori remap* vengono tutti o allocati o nullificati
1618 IF (optio_log(ltimesimple)) THEN
1619  CALL vol7d_remap2simple_datetime(this%time, that%time, v7dtmp%time, &
1620  lsort, remapt1, remapt2)
1621 ELSE
1622  CALL vol7d_remap2_datetime(this%time, that%time, v7dtmp%time, &
1623  lsort, remapt1, remapt2)
1624 ENDIF
1625 IF (optio_log(ltimerangesimple)) THEN
1626  CALL vol7d_remap2simple_vol7d_timerange(this%timerange, that%timerange, &
1627  v7dtmp%timerange, lsort, remaptr1, remaptr2)
1628 ELSE
1629  CALL vol7d_remap2_vol7d_timerange(this%timerange, that%timerange, &
1630  v7dtmp%timerange, lsort, remaptr1, remaptr2)
1631 ENDIF
1632 IF (optio_log(llevelsimple)) THEN
1633  CALL vol7d_remap2simple_vol7d_level(this%level, that%level, v7dtmp%level, &
1634  lsort, remapl1, remapl2)
1635 ELSE
1636  CALL vol7d_remap2_vol7d_level(this%level, that%level, v7dtmp%level, &
1637  lsort, remapl1, remapl2)
1638 ENDIF
1639 IF (optio_log(lanasimple)) THEN
1640  CALL vol7d_remap2simple_vol7d_ana(this%ana, that%ana, v7dtmp%ana, &
1641  .false., remapa1, remapa2)
1642 ELSE
1643  CALL vol7d_remap2_vol7d_ana(this%ana, that%ana, v7dtmp%ana, &
1644  .false., remapa1, remapa2)
1645 ENDIF
1646 IF (optio_log(lnetworksimple)) THEN
1647  CALL vol7d_remap2simple_vol7d_network(this%network, that%network, v7dtmp%network, &
1648  .false., remapn1, remapn2)
1649 ELSE
1650  CALL vol7d_remap2_vol7d_network(this%network, that%network, v7dtmp%network, &
1651  .false., remapn1, remapn2)
1652 ENDIF
1653 
1654 ! Faccio la fusione fisica dei volumi
1655 CALL vol7d_merge_finalr(this, that, v7dtmp, &
1656  remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1657  remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1658 CALL vol7d_merge_finald(this, that, v7dtmp, &
1659  remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1660  remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1661 CALL vol7d_merge_finali(this, that, v7dtmp, &
1662  remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1663  remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1664 CALL vol7d_merge_finalb(this, that, v7dtmp, &
1665  remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1666  remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1667 CALL vol7d_merge_finalc(this, that, v7dtmp, &
1668  remapa1, remapa2, remapt1, remapt2, remapl1, remapl2, &
1669  remaptr1, remaptr2, remapn1, remapn2, lbestdata)
1670 
1671 ! Dealloco i vettori di rimappatura
1672 IF (ASSOCIATED(remapt1)) DEALLOCATE(remapt1)
1673 IF (ASSOCIATED(remapt2)) DEALLOCATE(remapt2)
1674 IF (ASSOCIATED(remaptr1)) DEALLOCATE(remaptr1)
1675 IF (ASSOCIATED(remaptr2)) DEALLOCATE(remaptr2)
1676 IF (ASSOCIATED(remapl1)) DEALLOCATE(remapl1)
1677 IF (ASSOCIATED(remapl2)) DEALLOCATE(remapl2)
1678 IF (ASSOCIATED(remapa1)) DEALLOCATE(remapa1)
1679 IF (ASSOCIATED(remapa2)) DEALLOCATE(remapa2)
1680 IF (ASSOCIATED(remapn1)) DEALLOCATE(remapn1)
1681 IF (ASSOCIATED(remapn2)) DEALLOCATE(remapn2)
1682 
1683 ! Distruggo il vecchio volume e assegno il nuovo a this
1684 CALL delete(this)
1685 this = v7dtmp
1686 ! Ricreo gli indici var-attr
1687 CALL vol7d_set_attr_ind(this)
1688 
1689 END SUBROUTINE vol7d_append
1690 
1691 
1724 SUBROUTINE vol7d_copy(this, that, sort, unique, miss, &
1725  lsort_time, lsort_timerange, lsort_level, &
1726  ltime, ltimerange, llevel, lana, lnetwork, &
1727  lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
1728  lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
1729  lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
1730  ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
1731  ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
1732  ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc)
1733 TYPE(vol7d),INTENT(IN) :: this
1734 TYPE(vol7d),INTENT(INOUT) :: that
1735 LOGICAL,INTENT(IN),OPTIONAL :: sort
1736 LOGICAL,INTENT(IN),OPTIONAL :: unique
1737 LOGICAL,INTENT(IN),OPTIONAL :: miss
1738 LOGICAL,INTENT(IN),OPTIONAL :: lsort_time
1739 LOGICAL,INTENT(IN),OPTIONAL :: lsort_timerange
1740 LOGICAL,INTENT(IN),OPTIONAL :: lsort_level
1748 LOGICAL,INTENT(IN),OPTIONAL :: ltime(:)
1750 LOGICAL,INTENT(IN),OPTIONAL :: ltimerange(:)
1752 LOGICAL,INTENT(IN),OPTIONAL :: llevel(:)
1754 LOGICAL,INTENT(IN),OPTIONAL :: lana(:)
1756 LOGICAL,INTENT(IN),OPTIONAL :: lnetwork(:)
1758 LOGICAL,INTENT(in),OPTIONAL :: &
1759  lanavarr(:), lanavard(:), lanavari(:), lanavarb(:), lanavarc(:), &
1760  lanaattrr(:), lanaattrd(:), lanaattri(:), lanaattrb(:), lanaattrc(:), &
1761  lanavarattrr(:), lanavarattrd(:), lanavarattri(:), lanavarattrb(:), lanavarattrc(:), &
1762  ldativarr(:), ldativard(:), ldativari(:), ldativarb(:), ldativarc(:), &
1763  ldatiattrr(:), ldatiattrd(:), ldatiattri(:), ldatiattrb(:), ldatiattrc(:), &
1764  ldativarattrr(:), ldativarattrd(:), ldativarattri(:), ldativarattrb(:), ldativarattrc(:)
1765 
1766 LOGICAL :: lsort, lunique, lmiss
1767 INTEGER,POINTER :: remapt(:), remaptr(:), remapl(:), remapa(:), remapn(:)
1768 
1769 CALL init(that)
1770 IF (.NOT.c_e(this)) RETURN ! speedup, nothing to do
1771 IF (.NOT.vol7d_check_vol(this)) RETURN ! be safe
1772 
1773 CALL optio(sort, lsort)
1774 CALL optio(unique, lunique)
1775 CALL optio(miss, lmiss)
1776 
1777 ! Calcolo le mappature tra volume vecchio e volume nuovo
1778 ! I puntatori remap* vengono tutti o allocati o nullificati
1779 CALL vol7d_remap1_datetime(this%time, that%time, &
1780  lsort.OR.optio_log(lsort_time), lunique, lmiss, remapt, ltime)
1781 CALL vol7d_remap1_vol7d_timerange(this%timerange, that%timerange, &
1782  lsort.OR.optio_log(lsort_timerange), lunique, lmiss, remaptr, ltimerange)
1783 CALL vol7d_remap1_vol7d_level(this%level, that%level, &
1784  lsort.OR.optio_log(lsort_level), lunique, lmiss, remapl, llevel)
1785 CALL vol7d_remap1_vol7d_ana(this%ana, that%ana, &
1786  lsort, lunique, lmiss, remapa, lana)
1787 CALL vol7d_remap1_vol7d_network(this%network, that%network, &
1788  lsort, lunique, lmiss, remapn, lnetwork)
1789 
1790 ! lanavari, lanavarb, lanavarc, &
1791 ! lanaattri, lanaattrb, lanaattrc, &
1792 ! lanavarattri, lanavarattrb, lanavarattrc, &
1793 ! ldativari, ldativarb, ldativarc, &
1794 ! ldatiattri, ldatiattrb, ldatiattrc, &
1795 ! ldativarattri, ldativarattrb, ldativarattrc
1796 ! Faccio la riforma fisica dei volumi
1797 CALL vol7d_reform_finalr(this, that, &
1798  remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1799  lanavarr, lanaattrr, lanavarattrr, ldativarr, ldatiattrr, ldativarattrr)
1800 CALL vol7d_reform_finald(this, that, &
1801  remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1802  lanavard, lanaattrd, lanavarattrd, ldativard, ldatiattrd, ldativarattrd)
1803 CALL vol7d_reform_finali(this, that, &
1804  remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1805  lanavari, lanaattri, lanavarattri, ldativari, ldatiattri, ldativarattri)
1806 CALL vol7d_reform_finalb(this, that, &
1807  remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1808  lanavarb, lanaattrb, lanavarattrb, ldativarb, ldatiattrb, ldativarattrb)
1809 CALL vol7d_reform_finalc(this, that, &
1810  remapa, remapt, remapl, remaptr, remapn, lsort, lunique, lmiss, &
1811  lanavarc, lanaattrc, lanavarattrc, ldativarc, ldatiattrc, ldativarattrc)
1812 
1813 ! Dealloco i vettori di rimappatura
1814 IF (ASSOCIATED(remapt)) DEALLOCATE(remapt)
1815 IF (ASSOCIATED(remaptr)) DEALLOCATE(remaptr)
1816 IF (ASSOCIATED(remapl)) DEALLOCATE(remapl)
1817 IF (ASSOCIATED(remapa)) DEALLOCATE(remapa)
1818 IF (ASSOCIATED(remapn)) DEALLOCATE(remapn)
1819 
1820 ! Ricreo gli indici var-attr
1821 CALL vol7d_set_attr_ind(that)
1822 that%time_definition = this%time_definition
1823 
1824 END SUBROUTINE vol7d_copy
1825 
1826 
1837 SUBROUTINE vol7d_reform(this, sort, unique, miss, &
1838  lsort_time, lsort_timerange, lsort_level, &
1839  ltime, ltimerange, llevel, lana, lnetwork, &
1840  lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
1841  lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
1842  lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
1843  ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
1844  ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
1845  ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc&
1846  ,purgeana)
1847 TYPE(vol7d),INTENT(INOUT) :: this
1848 LOGICAL,INTENT(IN),OPTIONAL :: sort
1849 LOGICAL,INTENT(IN),OPTIONAL :: unique
1850 LOGICAL,INTENT(IN),OPTIONAL :: miss
1851 LOGICAL,INTENT(IN),OPTIONAL :: lsort_time
1852 LOGICAL,INTENT(IN),OPTIONAL :: lsort_timerange
1853 LOGICAL,INTENT(IN),OPTIONAL :: lsort_level
1861 LOGICAL,INTENT(IN),OPTIONAL :: ltime(:)
1862 LOGICAL,INTENT(IN),OPTIONAL :: ltimerange(:)
1863 LOGICAL,INTENT(IN),OPTIONAL :: llevel(:)
1864 LOGICAL,INTENT(IN),OPTIONAL :: lana(:)
1865 LOGICAL,INTENT(IN),OPTIONAL :: lnetwork(:)
1867 LOGICAL,INTENT(in),OPTIONAL :: &
1868  lanavarr(:), lanavard(:), lanavari(:), lanavarb(:), lanavarc(:), &
1869  lanaattrr(:), lanaattrd(:), lanaattri(:), lanaattrb(:), lanaattrc(:), &
1870  lanavarattrr(:), lanavarattrd(:), lanavarattri(:), lanavarattrb(:), lanavarattrc(:), &
1871  ldativarr(:), ldativard(:), ldativari(:), ldativarb(:), ldativarc(:), &
1872  ldatiattrr(:), ldatiattrd(:), ldatiattri(:), ldatiattrb(:), ldatiattrc(:), &
1873  ldativarattrr(:), ldativarattrd(:), ldativarattri(:), ldativarattrb(:), ldativarattrc(:)
1874 LOGICAL,INTENT(IN),OPTIONAL :: purgeana
1875 
1876 TYPE(vol7d) :: v7dtmp
1877 logical,allocatable :: llana(:)
1878 integer :: i
1879 
1880 CALL vol7d_copy(this, v7dtmp, sort, unique, miss, &
1881  lsort_time, lsort_timerange, lsort_level, &
1882  ltime, ltimerange, llevel, lana, lnetwork, &
1883  lanavarr, lanavard, lanavari, lanavarb, lanavarc, &
1884  lanaattrr, lanaattrd, lanaattri, lanaattrb, lanaattrc, &
1885  lanavarattrr, lanavarattrd, lanavarattri, lanavarattrb, lanavarattrc, &
1886  ldativarr, ldativard, ldativari, ldativarb, ldativarc, &
1887  ldatiattrr, ldatiattrd, ldatiattri, ldatiattrb, ldatiattrc, &
1888  ldativarattrr, ldativarattrd, ldativarattri, ldativarattrb, ldativarattrc)
1889 
1890 ! destroy old volume
1891 CALL delete(this)
1892 
1893 if (optio_log(purgeana)) then
1894  allocate(llana(size(v7dtmp%ana)))
1895  llana =.false.
1896  do i =1,size(v7dtmp%ana)
1897  if (associated(v7dtmp%voldatii)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatii(i,:,:,:,:,:)))
1898  if (associated(v7dtmp%voldatir)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatir(i,:,:,:,:,:)))
1899  if (associated(v7dtmp%voldatid)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatid(i,:,:,:,:,:)))
1900  if (associated(v7dtmp%voldatib)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatib(i,:,:,:,:,:)))
1901  if (associated(v7dtmp%voldatic)) llana(i)= llana(i) .or. any(c_e(v7dtmp%voldatic(i,:,:,:,:,:)))
1902  end do
1903  CALL vol7d_copy(v7dtmp, this,lana=llana)
1904  CALL delete(v7dtmp)
1905  deallocate(llana)
1906 else
1907  this=v7dtmp
1908 end if
1909 
1910 END SUBROUTINE vol7d_reform
1911 
1912 
1920 SUBROUTINE vol7d_smart_sort(this, lsort_time, lsort_timerange, lsort_level)
1921 TYPE(vol7d),INTENT(INOUT) :: this
1922 LOGICAL,OPTIONAL,INTENT(in) :: lsort_time
1923 LOGICAL,OPTIONAL,INTENT(in) :: lsort_timerange
1924 LOGICAL,OPTIONAL,INTENT(in) :: lsort_level
1925 
1926 INTEGER :: i
1927 LOGICAL :: to_be_sorted
1928 
1929 to_be_sorted = .false.
1930 CALL vol7d_alloc_vol(this) ! usual safety check
1931 
1932 IF (optio_log(lsort_time)) THEN
1933  DO i = 2, SIZE(this%time)
1934  IF (this%time(i) < this%time(i-1)) THEN
1935  to_be_sorted = .true.
1936  EXIT
1937  ENDIF
1938  ENDDO
1939 ENDIF
1940 IF (optio_log(lsort_timerange)) THEN
1941  DO i = 2, SIZE(this%timerange)
1942  IF (this%timerange(i) < this%timerange(i-1)) THEN
1943  to_be_sorted = .true.
1944  EXIT
1945  ENDIF
1946  ENDDO
1947 ENDIF
1948 IF (optio_log(lsort_level)) THEN
1949  DO i = 2, SIZE(this%level)
1950  IF (this%level(i) < this%level(i-1)) THEN
1951  to_be_sorted = .true.
1952  EXIT
1953  ENDIF
1954  ENDDO
1955 ENDIF
1956 
1957 IF (to_be_sorted) CALL vol7d_reform(this, &
1958  lsort_time=lsort_time, lsort_timerange=lsort_timerange, lsort_level=lsort_level )
1959 
1960 END SUBROUTINE vol7d_smart_sort
1961 
1969 SUBROUTINE vol7d_filter(this, avl, vl, nl, s_d, e_d)
1970 TYPE(vol7d),INTENT(inout) :: this
1971 CHARACTER(len=*),INTENT(in),OPTIONAL :: avl(:)
1972 CHARACTER(len=*),INTENT(in),OPTIONAL :: vl(:)
1973 TYPE(vol7d_network),OPTIONAL :: nl(:)
1974 TYPE(datetime),INTENT(in),OPTIONAL :: s_d
1975 TYPE(datetime),INTENT(in),OPTIONAL :: e_d
1976 
1977 INTEGER :: i
1978 
1979 IF (PRESENT(avl)) THEN
1980  IF (SIZE(avl) > 0) THEN
1981 
1982  IF (ASSOCIATED(this%anavar%r)) THEN
1983  DO i = 1, SIZE(this%anavar%r)
1984  IF (all(this%anavar%r(i)%btable /= avl)) this%anavar%r(i) = vol7d_var_miss
1985  ENDDO
1986  ENDIF
1987 
1988  IF (ASSOCIATED(this%anavar%i)) THEN
1989  DO i = 1, SIZE(this%anavar%i)
1990  IF (all(this%anavar%i(i)%btable /= avl)) this%anavar%i(i) = vol7d_var_miss
1991  ENDDO
1992  ENDIF
1993 
1994  IF (ASSOCIATED(this%anavar%b)) THEN
1995  DO i = 1, SIZE(this%anavar%b)
1996  IF (all(this%anavar%b(i)%btable /= avl)) this%anavar%b(i) = vol7d_var_miss
1997  ENDDO
1998  ENDIF
1999 
2000  IF (ASSOCIATED(this%anavar%d)) THEN
2001  DO i = 1, SIZE(this%anavar%d)
2002  IF (all(this%anavar%d(i)%btable /= avl)) this%anavar%d(i) = vol7d_var_miss
2003  ENDDO
2004  ENDIF
2005 
2006  IF (ASSOCIATED(this%anavar%c)) THEN
2007  DO i = 1, SIZE(this%anavar%c)
2008  IF (all(this%anavar%c(i)%btable /= avl)) this%anavar%c(i) = vol7d_var_miss
2009  ENDDO
2010  ENDIF
2011 
2012  ENDIF
2013 ENDIF
2014 
2015 
2016 IF (PRESENT(vl)) THEN
2017  IF (size(vl) > 0) THEN
2018  IF (ASSOCIATED(this%dativar%r)) THEN
2019  DO i = 1, SIZE(this%dativar%r)
2020  IF (all(this%dativar%r(i)%btable /= vl)) this%dativar%r(i) = vol7d_var_miss
2021  ENDDO
2022  ENDIF
2023 
2024  IF (ASSOCIATED(this%dativar%i)) THEN
2025  DO i = 1, SIZE(this%dativar%i)
2026  IF (all(this%dativar%i(i)%btable /= vl)) this%dativar%i(i) = vol7d_var_miss
2027  ENDDO
2028  ENDIF
2029 
2030  IF (ASSOCIATED(this%dativar%b)) THEN
2031  DO i = 1, SIZE(this%dativar%b)
2032  IF (all(this%dativar%b(i)%btable /= vl)) this%dativar%b(i) = vol7d_var_miss
2033  ENDDO
2034  ENDIF
2035 
2036  IF (ASSOCIATED(this%dativar%d)) THEN
2037  DO i = 1, SIZE(this%dativar%d)
2038  IF (all(this%dativar%d(i)%btable /= vl)) this%dativar%d(i) = vol7d_var_miss
2039  ENDDO
2040  ENDIF
2041 
2042  IF (ASSOCIATED(this%dativar%c)) THEN
2043  DO i = 1, SIZE(this%dativar%c)
2044  IF (all(this%dativar%c(i)%btable /= vl)) this%dativar%c(i) = vol7d_var_miss
2045  ENDDO
2046  ENDIF
2047 
2048  IF (ASSOCIATED(this%dativar%c)) THEN
2049  DO i = 1, SIZE(this%dativar%c)
2050  IF (all(this%dativar%c(i)%btable /= vl)) this%dativar%c(i) = vol7d_var_miss
2051  ENDDO
2052  ENDIF
2053 
2054  ENDIF
2055 ENDIF
2056 
2057 IF (PRESENT(nl)) THEN
2058  IF (SIZE(nl) > 0) THEN
2059  DO i = 1, SIZE(this%network)
2060  IF (all(this%network(i) /= nl)) this%network(i) = vol7d_network_miss
2061  ENDDO
2062  ENDIF
2063 ENDIF
2064 
2065 IF (PRESENT(s_d)) THEN
2066  IF (c_e(s_d)) THEN
2067  WHERE (this%time < s_d)
2068  this%time = datetime_miss
2069  END WHERE
2070  ENDIF
2071 ENDIF
2072 
2073 IF (PRESENT(e_d)) THEN
2074  IF (c_e(e_d)) THEN
2075  WHERE (this%time > e_d)
2076  this%time = datetime_miss
2077  END WHERE
2078  ENDIF
2079 ENDIF
2080 
2081 CALL vol7d_reform(this, miss=.true.)
2082 
2083 END SUBROUTINE vol7d_filter
2084 
2085 
2092 SUBROUTINE vol7d_convr(this, that, anaconv)
2093 TYPE(vol7d),INTENT(IN) :: this
2094 TYPE(vol7d),INTENT(INOUT) :: that
2095 LOGICAL,OPTIONAL,INTENT(in) :: anaconv
2096 INTEGER :: i
2097 LOGICAL :: fv(1)=(/.false./), tv(1)=(/.true./), acp(1), acn(1)
2098 TYPE(vol7d) :: v7d_tmp
2099 
2100 IF (optio_log(anaconv)) THEN
2101  acp=fv
2102  acn=tv
2103 ELSE
2104  acp=tv
2105  acn=fv
2106 ENDIF
2107 
2108 ! Volume con solo i dati reali e tutti gli attributi
2109 ! l'anagrafica e` copiata interamente se necessario
2110 CALL vol7d_copy(this, that, &
2111  lanavarr=tv, lanavard=acp, lanavari=acp, lanavarb=acp, lanavarc=acp, &
2112  ldativarr=tv, ldativard=fv, ldativari=fv, ldativarb=fv, ldativarc=fv)
2113 
2114 ! Volume solo di dati double
2115 CALL vol7d_copy(this, v7d_tmp, &
2116  lanavarr=fv, lanavard=acn, lanavari=fv, lanavarb=fv, lanavarc=fv, &
2117  lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
2118  lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
2119  ldativarr=fv, ldativard=tv, ldativari=fv, ldativarb=fv, ldativarc=fv, &
2120  ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
2121  ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
2122 
2123 ! converto a dati reali
2124 IF (ASSOCIATED(v7d_tmp%anavar%d) .OR. ASSOCIATED(v7d_tmp%dativar%d)) THEN
2125 
2126  IF (ASSOCIATED(v7d_tmp%anavar%d)) THEN
2127 ! alloco i dati reali e vi trasferisco i double
2128  ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanad, 1), SIZE(v7d_tmp%volanad, 2), &
2129  SIZE(v7d_tmp%volanad, 3)))
2130  DO i = 1, SIZE(v7d_tmp%anavar%d)
2131  v7d_tmp%volanar(:,i,:) = &
2132  realdat(v7d_tmp%volanad(:,i,:), v7d_tmp%anavar%d(i))
2133  ENDDO
2134  DEALLOCATE(v7d_tmp%volanad)
2135 ! trasferisco le variabili
2136  v7d_tmp%anavar%r => v7d_tmp%anavar%d
2137  NULLIFY(v7d_tmp%anavar%d)
2138  ENDIF
2139 
2140  IF (ASSOCIATED(v7d_tmp%dativar%d)) THEN
2141 ! alloco i dati reali e vi trasferisco i double
2142  ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatid, 1), SIZE(v7d_tmp%voldatid, 2), &
2143  SIZE(v7d_tmp%voldatid, 3), SIZE(v7d_tmp%voldatid, 4), SIZE(v7d_tmp%voldatid, 5), &
2144  SIZE(v7d_tmp%voldatid, 6)))
2145  DO i = 1, SIZE(v7d_tmp%dativar%d)
2146  v7d_tmp%voldatir(:,:,:,:,i,:) = &
2147  realdat(v7d_tmp%voldatid(:,:,:,:,i,:), v7d_tmp%dativar%d(i))
2148  ENDDO
2149  DEALLOCATE(v7d_tmp%voldatid)
2150 ! trasferisco le variabili
2151  v7d_tmp%dativar%r => v7d_tmp%dativar%d
2152  NULLIFY(v7d_tmp%dativar%d)
2153  ENDIF
2154 
2155 ! fondo con il volume definitivo
2156  CALL vol7d_merge(that, v7d_tmp)
2157 ELSE
2158  CALL delete(v7d_tmp)
2159 ENDIF
2160 
2161 
2162 ! Volume solo di dati interi
2163 CALL vol7d_copy(this, v7d_tmp, &
2164  lanavarr=fv, lanavard=fv, lanavari=acn, lanavarb=fv, lanavarc=fv, &
2165  lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
2166  lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
2167  ldativarr=fv, ldativard=fv, ldativari=tv, ldativarb=fv, ldativarc=fv, &
2168  ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
2169  ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
2170 
2171 ! converto a dati reali
2172 IF (ASSOCIATED(v7d_tmp%anavar%i) .OR. ASSOCIATED(v7d_tmp%dativar%i)) THEN
2173 
2174  IF (ASSOCIATED(v7d_tmp%anavar%i)) THEN
2175 ! alloco i dati reali e vi trasferisco gli interi
2176  ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanai, 1), SIZE(v7d_tmp%volanai, 2), &
2177  SIZE(v7d_tmp%volanai, 3)))
2178  DO i = 1, SIZE(v7d_tmp%anavar%i)
2179  v7d_tmp%volanar(:,i,:) = &
2180  realdat(v7d_tmp%volanai(:,i,:), v7d_tmp%anavar%i(i))
2181  ENDDO
2182  DEALLOCATE(v7d_tmp%volanai)
2183 ! trasferisco le variabili
2184  v7d_tmp%anavar%r => v7d_tmp%anavar%i
2185  NULLIFY(v7d_tmp%anavar%i)
2186  ENDIF
2187 
2188  IF (ASSOCIATED(v7d_tmp%dativar%i)) THEN
2189 ! alloco i dati reali e vi trasferisco gli interi
2190  ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatii, 1), SIZE(v7d_tmp%voldatii, 2), &
2191  SIZE(v7d_tmp%voldatii, 3), SIZE(v7d_tmp%voldatii, 4), SIZE(v7d_tmp%voldatii, 5), &
2192  SIZE(v7d_tmp%voldatii, 6)))
2193  DO i = 1, SIZE(v7d_tmp%dativar%i)
2194  v7d_tmp%voldatir(:,:,:,:,i,:) = &
2195  realdat(v7d_tmp%voldatii(:,:,:,:,i,:), v7d_tmp%dativar%i(i))
2196  ENDDO
2197  DEALLOCATE(v7d_tmp%voldatii)
2198 ! trasferisco le variabili
2199  v7d_tmp%dativar%r => v7d_tmp%dativar%i
2200  NULLIFY(v7d_tmp%dativar%i)
2201  ENDIF
2202 
2203 ! fondo con il volume definitivo
2204  CALL vol7d_merge(that, v7d_tmp)
2205 ELSE
2206  CALL delete(v7d_tmp)
2207 ENDIF
2208 
2209 
2210 ! Volume solo di dati byte
2211 CALL vol7d_copy(this, v7d_tmp, &
2212  lanavarr=fv, lanavard=fv, lanavari=fv, lanavarb=acn, lanavarc=fv, &
2213  lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
2214  lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
2215  ldativarr=fv, ldativard=fv, ldativari=fv, ldativarb=tv, ldativarc=fv, &
2216  ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
2217  ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
2218 
2219 ! converto a dati reali
2220 IF (ASSOCIATED(v7d_tmp%anavar%b) .OR. ASSOCIATED(v7d_tmp%dativar%b)) THEN
2221 
2222  IF (ASSOCIATED(v7d_tmp%anavar%b)) THEN
2223 ! alloco i dati reali e vi trasferisco i byte
2224  ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanab, 1), SIZE(v7d_tmp%volanab, 2), &
2225  SIZE(v7d_tmp%volanab, 3)))
2226  DO i = 1, SIZE(v7d_tmp%anavar%b)
2227  v7d_tmp%volanar(:,i,:) = &
2228  realdat(v7d_tmp%volanab(:,i,:), v7d_tmp%anavar%b(i))
2229  ENDDO
2230  DEALLOCATE(v7d_tmp%volanab)
2231 ! trasferisco le variabili
2232  v7d_tmp%anavar%r => v7d_tmp%anavar%b
2233  NULLIFY(v7d_tmp%anavar%b)
2234  ENDIF
2235 
2236  IF (ASSOCIATED(v7d_tmp%dativar%b)) THEN
2237 ! alloco i dati reali e vi trasferisco i byte
2238  ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatib, 1), SIZE(v7d_tmp%voldatib, 2), &
2239  SIZE(v7d_tmp%voldatib, 3), SIZE(v7d_tmp%voldatib, 4), SIZE(v7d_tmp%voldatib, 5), &
2240  SIZE(v7d_tmp%voldatib, 6)))
2241  DO i = 1, SIZE(v7d_tmp%dativar%b)
2242  v7d_tmp%voldatir(:,:,:,:,i,:) = &
2243  realdat(v7d_tmp%voldatib(:,:,:,:,i,:), v7d_tmp%dativar%b(i))
2244  ENDDO
2245  DEALLOCATE(v7d_tmp%voldatib)
2246 ! trasferisco le variabili
2247  v7d_tmp%dativar%r => v7d_tmp%dativar%b
2248  NULLIFY(v7d_tmp%dativar%b)
2249  ENDIF
2250 
2251 ! fondo con il volume definitivo
2252  CALL vol7d_merge(that, v7d_tmp)
2253 ELSE
2254  CALL delete(v7d_tmp)
2255 ENDIF
2256 
2257 
2258 ! Volume solo di dati character
2259 CALL vol7d_copy(this, v7d_tmp, &
2260  lanavarr=fv, lanavard=fv, lanavari=fv, lanavarb=fv, lanavarc=acn, &
2261  lanaattrr=fv, lanaattrd=fv, lanaattri=fv, lanaattrb=fv, lanaattrc=fv, &
2262  lanavarattrr=fv, lanavarattrd=fv, lanavarattri=fv, lanavarattrb=fv, lanavarattrc=fv, &
2263  ldativarr=fv, ldativard=fv, ldativari=fv, ldativarb=fv, ldativarc=tv, &
2264  ldatiattrr=fv, ldatiattrd=fv, ldatiattri=fv, ldatiattrb=fv, ldatiattrc=fv, &
2265  ldativarattrr=fv, ldativarattrd=fv, ldativarattri=fv, ldativarattrb=fv, ldativarattrc=fv)
2266 
2267 ! converto a dati reali
2268 IF (ASSOCIATED(v7d_tmp%anavar%c) .OR. ASSOCIATED(v7d_tmp%dativar%c)) THEN
2269 
2270  IF (ASSOCIATED(v7d_tmp%anavar%c)) THEN
2271 ! alloco i dati reali e vi trasferisco i character
2272  ALLOCATE(v7d_tmp%volanar(SIZE(v7d_tmp%volanac, 1), SIZE(v7d_tmp%volanac, 2), &
2273  SIZE(v7d_tmp%volanac, 3)))
2274  DO i = 1, SIZE(v7d_tmp%anavar%c)
2275  v7d_tmp%volanar(:,i,:) = &
2276  realdat(v7d_tmp%volanac(:,i,:), v7d_tmp%anavar%c(i))
2277  ENDDO
2278  DEALLOCATE(v7d_tmp%volanac)
2279 ! trasferisco le variabili
2280  v7d_tmp%anavar%r => v7d_tmp%anavar%c
2281  NULLIFY(v7d_tmp%anavar%c)
2282  ENDIF
2283 
2284  IF (ASSOCIATED(v7d_tmp%dativar%c)) THEN
2285 ! alloco i dati reali e vi trasferisco i character
2286  ALLOCATE(v7d_tmp%voldatir(SIZE(v7d_tmp%voldatic, 1), SIZE(v7d_tmp%voldatic, 2), &
2287  SIZE(v7d_tmp%voldatic, 3), SIZE(v7d_tmp%voldatic, 4), SIZE(v7d_tmp%voldatic, 5), &
2288  SIZE(v7d_tmp%voldatic, 6)))
2289  DO i = 1, SIZE(v7d_tmp%dativar%c)
2290  v7d_tmp%voldatir(:,:,:,:,i,:) = &
2291  realdat(v7d_tmp%voldatic(:,:,:,:,i,:), v7d_tmp%dativar%c(i))
2292  ENDDO
2293  DEALLOCATE(v7d_tmp%voldatic)
2294 ! trasferisco le variabili
2295  v7d_tmp%dativar%r => v7d_tmp%dativar%c
2296  NULLIFY(v7d_tmp%dativar%c)
2297  ENDIF
2298 
2299 ! fondo con il volume definitivo
2300  CALL vol7d_merge(that, v7d_tmp)
2301 ELSE
2302  CALL delete(v7d_tmp)
2303 ENDIF
2304 
2305 END SUBROUTINE vol7d_convr
2306 
2307 
2311 SUBROUTINE vol7d_diff_only (this, that, data_only,ana)
2312 TYPE(vol7d),INTENT(IN) :: this
2313 TYPE(vol7d),INTENT(OUT) :: that
2314 logical , optional, intent(in) :: data_only
2315 logical , optional, intent(in) :: ana
2316 logical :: ldata_only,lana
2317 
2318 IF (PRESENT(data_only)) THEN
2319  ldata_only = data_only
2320 ELSE
2321  ldata_only = .false.
2322 ENDIF
2323 
2324 IF (PRESENT(ana)) THEN
2325  lana = ana
2326 ELSE
2327  lana = .false.
2328 ENDIF
2329 
2330 
2331 #undef VOL7D_POLY_ARRAY
2332 #define VOL7D_POLY_ARRAY voldati
2333 #include "vol7d_class_diff.F90"
2334 #undef VOL7D_POLY_ARRAY
2335 #define VOL7D_POLY_ARRAY voldatiattr
2336 #include "vol7d_class_diff.F90"
2337 #undef VOL7D_POLY_ARRAY
2338 
2339 if ( .not. ldata_only) then
2340 
2341 #define VOL7D_POLY_ARRAY volana
2342 #include "vol7d_class_diff.F90"
2343 #undef VOL7D_POLY_ARRAY
2344 #define VOL7D_POLY_ARRAY volanaattr
2345 #include "vol7d_class_diff.F90"
2346 #undef VOL7D_POLY_ARRAY
2347 
2348  if(lana)then
2349  where ( this%ana == that%ana )
2350  that%ana = vol7d_ana_miss
2351  end where
2352  end if
2353 
2354 end if
2355 
2356 
2357 
2358 END SUBROUTINE vol7d_diff_only
2359 
2360 
2361 
2362 ! Creo le routine da ripetere per i vari tipi di dati di v7d
2363 ! tramite un template e il preprocessore
2364 #undef VOL7D_POLY_TYPE
2365 #undef VOL7D_POLY_TYPES
2366 #define VOL7D_POLY_TYPE REAL
2367 #define VOL7D_POLY_TYPES r
2368 #include "vol7d_class_type_templ.F90"
2369 #undef VOL7D_POLY_TYPE
2370 #undef VOL7D_POLY_TYPES
2371 #define VOL7D_POLY_TYPE DOUBLE PRECISION
2372 #define VOL7D_POLY_TYPES d
2373 #include "vol7d_class_type_templ.F90"
2374 #undef VOL7D_POLY_TYPE
2375 #undef VOL7D_POLY_TYPES
2376 #define VOL7D_POLY_TYPE INTEGER
2377 #define VOL7D_POLY_TYPES i
2378 #include "vol7d_class_type_templ.F90"
2379 #undef VOL7D_POLY_TYPE
2380 #undef VOL7D_POLY_TYPES
2381 #define VOL7D_POLY_TYPE INTEGER(kind=int_b)
2382 #define VOL7D_POLY_TYPES b
2383 #include "vol7d_class_type_templ.F90"
2384 #undef VOL7D_POLY_TYPE
2385 #undef VOL7D_POLY_TYPES
2386 #define VOL7D_POLY_TYPE CHARACTER(len=vol7d_cdatalen)
2387 #define VOL7D_POLY_TYPES c
2388 #include "vol7d_class_type_templ.F90"
2389 
2390 ! Creo le routine da ripetere per i vari descrittori di dimensioni di v7d
2391 ! tramite un template e il preprocessore
2392 #define VOL7D_SORT
2393 #undef VOL7D_NO_ZERO_ALLOC
2394 #undef VOL7D_POLY_TYPE
2395 #define VOL7D_POLY_TYPE datetime
2396 #include "vol7d_class_desc_templ.F90"
2397 #undef VOL7D_POLY_TYPE
2398 #define VOL7D_POLY_TYPE vol7d_timerange
2399 #include "vol7d_class_desc_templ.F90"
2400 #undef VOL7D_POLY_TYPE
2401 #define VOL7D_POLY_TYPE vol7d_level
2402 #include "vol7d_class_desc_templ.F90"
2403 #undef VOL7D_SORT
2404 #undef VOL7D_POLY_TYPE
2405 #define VOL7D_POLY_TYPE vol7d_network
2406 #include "vol7d_class_desc_templ.F90"
2407 #undef VOL7D_POLY_TYPE
2408 #define VOL7D_POLY_TYPE vol7d_ana
2409 #include "vol7d_class_desc_templ.F90"
2410 #define VOL7D_NO_ZERO_ALLOC
2411 #undef VOL7D_POLY_TYPE
2412 #define VOL7D_POLY_TYPE vol7d_var
2413 #include "vol7d_class_desc_templ.F90"
2414 
2424 subroutine vol7d_write_on_file (this,unit,description,filename,filename_auto)
2425 
2426 TYPE(vol7d),INTENT(IN) :: this
2427 integer,optional,intent(inout) :: unit
2428 character(len=*),intent(in),optional :: filename
2429 character(len=*),intent(out),optional :: filename_auto
2430 character(len=*),INTENT(IN),optional :: description
2431 
2432 integer :: lunit
2433 character(len=254) :: ldescription,arg,lfilename
2434 integer :: nana, ntime, ntimerange, nlevel, nnetwork, &
2435  ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
2436  ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
2437  ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
2438  nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
2439  nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
2440  nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
2441 !integer :: im,id,iy
2442 integer :: tarray(8)
2443 logical :: opened,exist
2444 
2445  nana=0
2446  ntime=0
2447  ntimerange=0
2448  nlevel=0
2449  nnetwork=0
2450  ndativarr=0
2451  ndativari=0
2452  ndativarb=0
2453  ndativard=0
2454  ndativarc=0
2455  ndatiattrr=0
2456  ndatiattri=0
2457  ndatiattrb=0
2458  ndatiattrd=0
2459  ndatiattrc=0
2460  ndativarattrr=0
2461  ndativarattri=0
2462  ndativarattrb=0
2463  ndativarattrd=0
2464  ndativarattrc=0
2465  nanavarr=0
2466  nanavari=0
2467  nanavarb=0
2468  nanavard=0
2469  nanavarc=0
2470  nanaattrr=0
2471  nanaattri=0
2472  nanaattrb=0
2473  nanaattrd=0
2474  nanaattrc=0
2475  nanavarattrr=0
2476  nanavarattri=0
2477  nanavarattrb=0
2478  nanavarattrd=0
2479  nanavarattrc=0
2480 
2481 
2482 !call idate(im,id,iy)
2483 call date_and_time(values=tarray)
2484 call getarg(0,arg)
2485 
2486 if (present(description))then
2487  ldescription=description
2488 else
2489  ldescription="Vol7d generated by: "//trim(arg)
2490 end if
2491 
2492 if (.not. present(unit))then
2493  lunit=getunit()
2494 else
2495  if (unit==0)then
2496  lunit=getunit()
2497  unit=lunit
2498  else
2499  lunit=unit
2500  end if
2501 end if
2502 
2503 lfilename=trim(arg)//".v7d"
2504 if (index(arg,'/',back=.true.) > 0) lfilename=lfilename(index(arg,'/',back=.true.)+1 : )
2505 
2506 if (present(filename))then
2507  if (filename /= "")then
2508  lfilename=filename
2509  end if
2510 end if
2511 
2512 if (present(filename_auto))filename_auto=lfilename
2513 
2514 
2515 inquire(unit=lunit,opened=opened)
2516 if (.not. opened) then
2517 ! inquire(file=lfilename, EXIST=exist)
2518 ! IF (exist) THEN
2519 ! CALL l4f_log(L4F_FATAL, &
2520 ! 'in vol7d_write_on_file, file exists, cannot open file '//TRIM(lfilename))
2521 ! CALL raise_fatal_error()
2522 ! ENDIF
2523  OPEN(unit=lunit, file=lfilename, form='UNFORMATTED', access='STREAM')
2524  CALL l4f_log(l4f_info, 'opened: '//trim(lfilename))
2525 end if
2526 
2527 if (associated(this%ana)) nana=size(this%ana)
2528 if (associated(this%time)) ntime=size(this%time)
2529 if (associated(this%timerange)) ntimerange=size(this%timerange)
2530 if (associated(this%level)) nlevel=size(this%level)
2531 if (associated(this%network)) nnetwork=size(this%network)
2532 
2533 if (associated(this%dativar%r)) ndativarr=size(this%dativar%r)
2534 if (associated(this%dativar%i)) ndativari=size(this%dativar%i)
2535 if (associated(this%dativar%b)) ndativarb=size(this%dativar%b)
2536 if (associated(this%dativar%d)) ndativard=size(this%dativar%d)
2537 if (associated(this%dativar%c)) ndativarc=size(this%dativar%c)
2538 
2539 if (associated(this%datiattr%r)) ndatiattrr=size(this%datiattr%r)
2540 if (associated(this%datiattr%i)) ndatiattri=size(this%datiattr%i)
2541 if (associated(this%datiattr%b)) ndatiattrb=size(this%datiattr%b)
2542 if (associated(this%datiattr%d)) ndatiattrd=size(this%datiattr%d)
2543 if (associated(this%datiattr%c)) ndatiattrc=size(this%datiattr%c)
2544 
2545 if (associated(this%dativarattr%r)) ndativarattrr=size(this%dativarattr%r)
2546 if (associated(this%dativarattr%i)) ndativarattri=size(this%dativarattr%i)
2547 if (associated(this%dativarattr%b)) ndativarattrb=size(this%dativarattr%b)
2548 if (associated(this%dativarattr%d)) ndativarattrd=size(this%dativarattr%d)
2549 if (associated(this%dativarattr%c)) ndativarattrc=size(this%dativarattr%c)
2550 
2551 if (associated(this%anavar%r)) nanavarr=size(this%anavar%r)
2552 if (associated(this%anavar%i)) nanavari=size(this%anavar%i)
2553 if (associated(this%anavar%b)) nanavarb=size(this%anavar%b)
2554 if (associated(this%anavar%d)) nanavard=size(this%anavar%d)
2555 if (associated(this%anavar%c)) nanavarc=size(this%anavar%c)
2556 
2557 if (associated(this%anaattr%r)) nanaattrr=size(this%anaattr%r)
2558 if (associated(this%anaattr%i)) nanaattri=size(this%anaattr%i)
2559 if (associated(this%anaattr%b)) nanaattrb=size(this%anaattr%b)
2560 if (associated(this%anaattr%d)) nanaattrd=size(this%anaattr%d)
2561 if (associated(this%anaattr%c)) nanaattrc=size(this%anaattr%c)
2562 
2563 if (associated(this%anavarattr%r)) nanavarattrr=size(this%anavarattr%r)
2564 if (associated(this%anavarattr%i)) nanavarattri=size(this%anavarattr%i)
2565 if (associated(this%anavarattr%b)) nanavarattrb=size(this%anavarattr%b)
2566 if (associated(this%anavarattr%d)) nanavarattrd=size(this%anavarattr%d)
2567 if (associated(this%anavarattr%c)) nanavarattrc=size(this%anavarattr%c)
2568 
2569 write(unit=lunit)ldescription
2570 write(unit=lunit)tarray
2571 
2572 write(unit=lunit)&
2573  nana, ntime, ntimerange, nlevel, nnetwork, &
2574  ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
2575  ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
2576  ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
2577  nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
2578  nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
2579  nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc, &
2580  this%time_definition
2581 
2582 
2583 !write(unit=lunit)this
2584 
2585 
2586 !! prime 5 dimensioni
2587 if (associated(this%ana)) call write_unit(this%ana, lunit)
2588 if (associated(this%time)) call write_unit(this%time, lunit)
2589 if (associated(this%level)) write(unit=lunit)this%level
2590 if (associated(this%timerange)) write(unit=lunit)this%timerange
2591 if (associated(this%network)) write(unit=lunit)this%network
2592 
2593  !! 6a dimensione: variabile dell'anagrafica e dei dati
2594  !! con relativi attributi e in 5 tipi diversi
2595 
2596 if (associated(this%anavar%r)) write(unit=lunit)this%anavar%r
2597 if (associated(this%anavar%i)) write(unit=lunit)this%anavar%i
2598 if (associated(this%anavar%b)) write(unit=lunit)this%anavar%b
2599 if (associated(this%anavar%d)) write(unit=lunit)this%anavar%d
2600 if (associated(this%anavar%c)) write(unit=lunit)this%anavar%c
2601 
2602 if (associated(this%anaattr%r)) write(unit=lunit)this%anaattr%r
2603 if (associated(this%anaattr%i)) write(unit=lunit)this%anaattr%i
2604 if (associated(this%anaattr%b)) write(unit=lunit)this%anaattr%b
2605 if (associated(this%anaattr%d)) write(unit=lunit)this%anaattr%d
2606 if (associated(this%anaattr%c)) write(unit=lunit)this%anaattr%c
2607 
2608 if (associated(this%anavarattr%r)) write(unit=lunit)this%anavarattr%r
2609 if (associated(this%anavarattr%i)) write(unit=lunit)this%anavarattr%i
2610 if (associated(this%anavarattr%b)) write(unit=lunit)this%anavarattr%b
2611 if (associated(this%anavarattr%d)) write(unit=lunit)this%anavarattr%d
2612 if (associated(this%anavarattr%c)) write(unit=lunit)this%anavarattr%c
2613 
2614 if (associated(this%dativar%r)) write(unit=lunit)this%dativar%r
2615 if (associated(this%dativar%i)) write(unit=lunit)this%dativar%i
2616 if (associated(this%dativar%b)) write(unit=lunit)this%dativar%b
2617 if (associated(this%dativar%d)) write(unit=lunit)this%dativar%d
2618 if (associated(this%dativar%c)) write(unit=lunit)this%dativar%c
2619 
2620 if (associated(this%datiattr%r)) write(unit=lunit)this%datiattr%r
2621 if (associated(this%datiattr%i)) write(unit=lunit)this%datiattr%i
2622 if (associated(this%datiattr%b)) write(unit=lunit)this%datiattr%b
2623 if (associated(this%datiattr%d)) write(unit=lunit)this%datiattr%d
2624 if (associated(this%datiattr%c)) write(unit=lunit)this%datiattr%c
2625 
2626 if (associated(this%dativarattr%r)) write(unit=lunit)this%dativarattr%r
2627 if (associated(this%dativarattr%i)) write(unit=lunit)this%dativarattr%i
2628 if (associated(this%dativarattr%b)) write(unit=lunit)this%dativarattr%b
2629 if (associated(this%dativarattr%d)) write(unit=lunit)this%dativarattr%d
2630 if (associated(this%dativarattr%c)) write(unit=lunit)this%dativarattr%c
2631 
2632 !! Volumi di valori e attributi per anagrafica e dati
2633 
2634 if (associated(this%volanar)) write(unit=lunit)this%volanar
2635 if (associated(this%volanaattrr)) write(unit=lunit)this%volanaattrr
2636 if (associated(this%voldatir)) write(unit=lunit)this%voldatir
2637 if (associated(this%voldatiattrr)) write(unit=lunit)this%voldatiattrr
2638 
2639 if (associated(this%volanai)) write(unit=lunit)this%volanai
2640 if (associated(this%volanaattri)) write(unit=lunit)this%volanaattri
2641 if (associated(this%voldatii)) write(unit=lunit)this%voldatii
2642 if (associated(this%voldatiattri)) write(unit=lunit)this%voldatiattri
2643 
2644 if (associated(this%volanab)) write(unit=lunit)this%volanab
2645 if (associated(this%volanaattrb)) write(unit=lunit)this%volanaattrb
2646 if (associated(this%voldatib)) write(unit=lunit)this%voldatib
2647 if (associated(this%voldatiattrb)) write(unit=lunit)this%voldatiattrb
2648 
2649 if (associated(this%volanad)) write(unit=lunit)this%volanad
2650 if (associated(this%volanaattrd)) write(unit=lunit)this%volanaattrd
2651 if (associated(this%voldatid)) write(unit=lunit)this%voldatid
2652 if (associated(this%voldatiattrd)) write(unit=lunit)this%voldatiattrd
2653 
2654 if (associated(this%volanac)) write(unit=lunit)this%volanac
2655 if (associated(this%volanaattrc)) write(unit=lunit)this%volanaattrc
2656 if (associated(this%voldatic)) write(unit=lunit)this%voldatic
2657 if (associated(this%voldatiattrc)) write(unit=lunit)this%voldatiattrc
2658 
2659 if (.not. present(unit)) close(unit=lunit)
2660 
2661 end subroutine vol7d_write_on_file
2662 
2663 
2670 
2671 
2672 subroutine vol7d_read_from_file (this,unit,filename,description,tarray,filename_auto)
2673 
2674 TYPE(vol7d),INTENT(OUT) :: this
2675 integer,intent(inout),optional :: unit
2676 character(len=*),INTENT(in),optional :: filename
2677 character(len=*),intent(out),optional :: filename_auto
2678 character(len=*),INTENT(out),optional :: description
2679 integer,intent(out),optional :: tarray(8)
2680 
2681 
2682 integer :: nana, ntime, ntimerange, nlevel, nnetwork, &
2683  ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
2684  ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
2685  ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
2686  nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
2687  nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
2688  nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc
2689 
2690 character(len=254) :: ldescription,lfilename,arg
2691 integer :: ltarray(8),lunit,ios
2692 logical :: opened,exist
2693 
2694 
2695 call getarg(0,arg)
2696 
2697 if (.not. present(unit))then
2698  lunit=getunit()
2699 else
2700  if (unit==0)then
2701  lunit=getunit()
2702  unit=lunit
2703  else
2704  lunit=unit
2705  end if
2706 end if
2707 
2708 lfilename=trim(arg)//".v7d"
2709 if (index(arg,'/',back=.true.) > 0) lfilename=lfilename(index(arg,'/',back=.true.)+1 : )
2710 
2711 if (present(filename))then
2712  if (filename /= "")then
2713  lfilename=filename
2714  end if
2715 end if
2716 
2717 if (present(filename_auto))filename_auto=lfilename
2718 
2719 
2720 inquire(unit=lunit,opened=opened)
2721 IF (.NOT. opened) THEN
2722  inquire(file=lfilename,exist=exist)
2723  IF (.NOT.exist) THEN
2724  CALL l4f_log(l4f_fatal, &
2725  'in vol7d_read_from_file, file does not exists, cannot open')
2726  CALL raise_fatal_error()
2727  ENDIF
2728  OPEN(unit=lunit, file=lfilename, form='UNFORMATTED', access='STREAM', &
2729  status='OLD', action='READ')
2730  CALL l4f_log(l4f_info, 'opened: '//trim(lfilename))
2731 end if
2732 
2733 
2734 call init(this)
2735 read(unit=lunit,iostat=ios)ldescription
2736 
2737 if (ios < 0) then ! A negative value indicates that the End of File or End of Record
2738  call vol7d_alloc (this)
2739  call vol7d_alloc_vol (this)
2740  if (present(description))description=ldescription
2741  if (present(tarray))tarray=ltarray
2742  if (.not. present(unit)) close(unit=lunit)
2743 end if
2744 
2745 read(unit=lunit)ltarray
2746 
2747 CALL l4f_log(l4f_info, 'Reading vol7d from file')
2748 CALL l4f_log(l4f_info, 'description: '//trim(ldescription))
2749 CALL l4f_log(l4f_info, 'written on '//trim(to_char(ltarray(1)))//' '// &
2750  trim(to_char(ltarray(2)))//' '//trim(to_char(ltarray(3))))
2751 
2752 if (present(description))description=ldescription
2753 if (present(tarray))tarray=ltarray
2754 
2755 read(unit=lunit)&
2756  nana, ntime, ntimerange, nlevel, nnetwork, &
2757  ndativarr, ndativari, ndativarb, ndativard, ndativarc,&
2758  ndatiattrr, ndatiattri, ndatiattrb, ndatiattrd, ndatiattrc,&
2759  ndativarattrr, ndativarattri, ndativarattrb, ndativarattrd, ndativarattrc,&
2760  nanavarr, nanavari, nanavarb, nanavard, nanavarc,&
2761  nanaattrr, nanaattri, nanaattrb, nanaattrd, nanaattrc,&
2762  nanavarattrr, nanavarattri, nanavarattrb, nanavarattrd, nanavarattrc, &
2763  this%time_definition
2764 
2765 call vol7d_alloc (this, &
2766  nana=nana, ntime=ntime, ntimerange=ntimerange, nlevel=nlevel, nnetwork=nnetwork,&
2767  ndativarr=ndativarr, ndativari=ndativari, ndativarb=ndativarb,&
2768  ndativard=ndativard, ndativarc=ndativarc,&
2769  ndatiattrr=ndatiattrr, ndatiattri=ndatiattri, ndatiattrb=ndatiattrb,&
2770  ndatiattrd=ndatiattrd, ndatiattrc=ndatiattrc,&
2771  ndativarattrr=ndativarattrr, ndativarattri=ndativarattri, ndativarattrb=ndativarattrb, &
2772  ndativarattrd=ndativarattrd, ndativarattrc=ndativarattrc,&
2773  nanavarr=nanavarr, nanavari=nanavari, nanavarb=nanavarb, &
2774  nanavard=nanavard, nanavarc=nanavarc,&
2775  nanaattrr=nanaattrr, nanaattri=nanaattri, nanaattrb=nanaattrb,&
2776  nanaattrd=nanaattrd, nanaattrc=nanaattrc,&
2777  nanavarattrr=nanavarattrr, nanavarattri=nanavarattri, nanavarattrb=nanavarattrb, &
2778  nanavarattrd=nanavarattrd, nanavarattrc=nanavarattrc)
2779 
2780 
2781 if (associated(this%ana)) call read_unit(this%ana, lunit)
2782 if (associated(this%time)) call read_unit(this%time, lunit)
2783 if (associated(this%level)) read(unit=lunit)this%level
2784 if (associated(this%timerange)) read(unit=lunit)this%timerange
2785 if (associated(this%network)) read(unit=lunit)this%network
2786 
2787 if (associated(this%anavar%r)) read(unit=lunit)this%anavar%r
2788 if (associated(this%anavar%i)) read(unit=lunit)this%anavar%i
2789 if (associated(this%anavar%b)) read(unit=lunit)this%anavar%b
2790 if (associated(this%anavar%d)) read(unit=lunit)this%anavar%d
2791 if (associated(this%anavar%c)) read(unit=lunit)this%anavar%c
2792 
2793 if (associated(this%anaattr%r)) read(unit=lunit)this%anaattr%r
2794 if (associated(this%anaattr%i)) read(unit=lunit)this%anaattr%i
2795 if (associated(this%anaattr%b)) read(unit=lunit)this%anaattr%b
2796 if (associated(this%anaattr%d)) read(unit=lunit)this%anaattr%d
2797 if (associated(this%anaattr%c)) read(unit=lunit)this%anaattr%c
2798 
2799 if (associated(this%anavarattr%r)) read(unit=lunit)this%anavarattr%r
2800 if (associated(this%anavarattr%i)) read(unit=lunit)this%anavarattr%i
2801 if (associated(this%anavarattr%b)) read(unit=lunit)this%anavarattr%b
2802 if (associated(this%anavarattr%d)) read(unit=lunit)this%anavarattr%d
2803 if (associated(this%anavarattr%c)) read(unit=lunit)this%anavarattr%c
2804 
2805 if (associated(this%dativar%r)) read(unit=lunit)this%dativar%r
2806 if (associated(this%dativar%i)) read(unit=lunit)this%dativar%i
2807 if (associated(this%dativar%b)) read(unit=lunit)this%dativar%b
2808 if (associated(this%dativar%d)) read(unit=lunit)this%dativar%d
2809 if (associated(this%dativar%c)) read(unit=lunit)this%dativar%c
2810 
2811 if (associated(this%datiattr%r)) read(unit=lunit)this%datiattr%r
2812 if (associated(this%datiattr%i)) read(unit=lunit)this%datiattr%i
2813 if (associated(this%datiattr%b)) read(unit=lunit)this%datiattr%b
2814 if (associated(this%datiattr%d)) read(unit=lunit)this%datiattr%d
2815 if (associated(this%datiattr%c)) read(unit=lunit)this%datiattr%c
2816 
2817 if (associated(this%dativarattr%r)) read(unit=lunit)this%dativarattr%r
2818 if (associated(this%dativarattr%i)) read(unit=lunit)this%dativarattr%i
2819 if (associated(this%dativarattr%b)) read(unit=lunit)this%dativarattr%b
2820 if (associated(this%dativarattr%d)) read(unit=lunit)this%dativarattr%d
2821 if (associated(this%dativarattr%c)) read(unit=lunit)this%dativarattr%c
2822 
2823 call vol7d_alloc_vol (this)
2824 
2825 !! Volumi di valori e attributi per anagrafica e dati
2826 
2827 if (associated(this%volanar)) read(unit=lunit)this%volanar
2828 if (associated(this%volanaattrr)) read(unit=lunit)this%volanaattrr
2829 if (associated(this%voldatir)) read(unit=lunit)this%voldatir
2830 if (associated(this%voldatiattrr)) read(unit=lunit)this%voldatiattrr
2831 
2832 if (associated(this%volanai)) read(unit=lunit)this%volanai
2833 if (associated(this%volanaattri)) read(unit=lunit)this%volanaattri
2834 if (associated(this%voldatii)) read(unit=lunit)this%voldatii
2835 if (associated(this%voldatiattri)) read(unit=lunit)this%voldatiattri
2836 
2837 if (associated(this%volanab)) read(unit=lunit)this%volanab
2838 if (associated(this%volanaattrb)) read(unit=lunit)this%volanaattrb
2839 if (associated(this%voldatib)) read(unit=lunit)this%voldatib
2840 if (associated(this%voldatiattrb)) read(unit=lunit)this%voldatiattrb
2841 
2842 if (associated(this%volanad)) read(unit=lunit)this%volanad
2843 if (associated(this%volanaattrd)) read(unit=lunit)this%volanaattrd
2844 if (associated(this%voldatid)) read(unit=lunit)this%voldatid
2845 if (associated(this%voldatiattrd)) read(unit=lunit)this%voldatiattrd
2846 
2847 if (associated(this%volanac)) read(unit=lunit)this%volanac
2848 if (associated(this%volanaattrc)) read(unit=lunit)this%volanaattrc
2849 if (associated(this%voldatic)) read(unit=lunit)this%voldatic
2850 if (associated(this%voldatiattrc)) read(unit=lunit)this%voldatiattrc
2851 
2852 if (.not. present(unit)) close(unit=lunit)
2853 
2854 end subroutine vol7d_read_from_file
2855 
2856 
2857 ! to double precision
2858 elemental doubleprecision function doubledatd(voldat,var)
2859 doubleprecision,intent(in) :: voldat
2860 type(vol7d_var),intent(in) :: var
2861 
2862 doubledatd=voldat
2863 
2864 end function doubledatd
2865 
2866 
2867 elemental doubleprecision function doubledatr(voldat,var)
2868 real,intent(in) :: voldat
2869 type(vol7d_var),intent(in) :: var
2870 
2871 if (c_e(voldat))then
2872  doubledatr=dble(voldat)
2873 else
2874  doubledatr=dmiss
2875 end if
2876 
2877 end function doubledatr
2878 
2879 
2880 elemental doubleprecision function doubledati(voldat,var)
2881 integer,intent(in) :: voldat
2882 type(vol7d_var),intent(in) :: var
2883 
2884 if (c_e(voldat)) then
2885  if (c_e(var%scalefactor))then
2886  doubledati=dble(voldat)/10.d0**var%scalefactor
2887  else
2888  doubledati=dble(voldat)
2889  endif
2890 else
2891  doubledati=dmiss
2892 end if
2893 
2894 end function doubledati
2895 
2896 
2897 elemental doubleprecision function doubledatb(voldat,var)
2898 integer(kind=int_b),intent(in) :: voldat
2899 type(vol7d_var),intent(in) :: var
2900 
2901 if (c_e(voldat)) then
2902  if (c_e(var%scalefactor))then
2903  doubledatb=dble(voldat)/10.d0**var%scalefactor
2904  else
2905  doubledatb=dble(voldat)
2906  endif
2907 else
2908  doubledatb=dmiss
2909 end if
2910 
2911 end function doubledatb
2912 
2913 
2914 elemental doubleprecision function doubledatc(voldat,var)
2915 CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
2916 type(vol7d_var),intent(in) :: var
2917 
2918 doubledatc = c2d(voldat)
2919 if (c_e(doubledatc) .and. c_e(var%scalefactor))then
2920  doubledatc=doubledatc/10.d0**var%scalefactor
2921 end if
2922 
2923 end function doubledatc
2924 
2925 
2926 ! to integer
2927 elemental integer function integerdatd(voldat,var)
2928 doubleprecision,intent(in) :: voldat
2929 type(vol7d_var),intent(in) :: var
2930 
2931 if (c_e(voldat))then
2932  if (c_e(var%scalefactor)) then
2933  integerdatd=nint(voldat*10d0**var%scalefactor)
2934  else
2935  integerdatd=nint(voldat)
2936  endif
2937 else
2938  integerdatd=imiss
2939 end if
2940 
2941 end function integerdatd
2942 
2943 
2944 elemental integer function integerdatr(voldat,var)
2945 real,intent(in) :: voldat
2946 type(vol7d_var),intent(in) :: var
2947 
2948 if (c_e(voldat))then
2949  if (c_e(var%scalefactor)) then
2950  integerdatr=nint(voldat*10d0**var%scalefactor)
2951  else
2952  integerdatr=nint(voldat)
2953  endif
2954 else
2955  integerdatr=imiss
2956 end if
2957 
2958 end function integerdatr
2959 
2960 
2961 elemental integer function integerdati(voldat,var)
2962 integer,intent(in) :: voldat
2963 type(vol7d_var),intent(in) :: var
2964 
2965 integerdati=voldat
2966 
2967 end function integerdati
2968 
2969 
2970 elemental integer function integerdatb(voldat,var)
2971 integer(kind=int_b),intent(in) :: voldat
2972 type(vol7d_var),intent(in) :: var
2973 
2974 if (c_e(voldat))then
2975  integerdatb=voldat
2976 else
2977  integerdatb=imiss
2978 end if
2979 
2980 end function integerdatb
2981 
2982 
2983 elemental integer function integerdatc(voldat,var)
2984 CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
2985 type(vol7d_var),intent(in) :: var
2986 
2987 integerdatc=c2i(voldat)
2988 
2989 end function integerdatc
2990 
2991 
2992 ! to real
2993 elemental real function realdatd(voldat,var)
2994 doubleprecision,intent(in) :: voldat
2995 type(vol7d_var),intent(in) :: var
2996 
2997 if (c_e(voldat))then
2998  realdatd=real(voldat)
2999 else
3000  realdatd=rmiss
3001 end if
3002 
3003 end function realdatd
3004 
3005 
3006 elemental real function realdatr(voldat,var)
3007 real,intent(in) :: voldat
3008 type(vol7d_var),intent(in) :: var
3009 
3010 realdatr=voldat
3011 
3012 end function realdatr
3013 
3014 
3015 elemental real function realdati(voldat,var)
3016 integer,intent(in) :: voldat
3017 type(vol7d_var),intent(in) :: var
3018 
3019 if (c_e(voldat)) then
3020  if (c_e(var%scalefactor))then
3021  realdati=float(voldat)/10.**var%scalefactor
3022  else
3023  realdati=float(voldat)
3024  endif
3025 else
3026  realdati=rmiss
3027 end if
3028 
3029 end function realdati
3030 
3031 
3032 elemental real function realdatb(voldat,var)
3033 integer(kind=int_b),intent(in) :: voldat
3034 type(vol7d_var),intent(in) :: var
3035 
3036 if (c_e(voldat)) then
3037  if (c_e(var%scalefactor))then
3038  realdatb=float(voldat)/10**var%scalefactor
3039  else
3040  realdatb=float(voldat)
3041  endif
3042 else
3043  realdatb=rmiss
3044 end if
3045 
3046 end function realdatb
3047 
3048 
3049 elemental real function realdatc(voldat,var)
3050 CHARACTER(len=vol7d_cdatalen),intent(in) :: voldat
3051 type(vol7d_var),intent(in) :: var
3052 
3053 realdatc=c2r(voldat)
3054 if (c_e(realdatc) .and. c_e(var%scalefactor))then
3055  realdatc=realdatc/10.**var%scalefactor
3056 end if
3057 
3058 end function realdatc
3059 
3060 
3066 FUNCTION realanavol(this, var) RESULT(vol)
3067 TYPE(vol7d),INTENT(in) :: this
3068 TYPE(vol7d_var),INTENT(in) :: var
3069 REAL :: vol(SIZE(this%ana),size(this%network))
3070 
3071 CHARACTER(len=1) :: dtype
3072 INTEGER :: indvar
3073 
3074 dtype = cmiss
3075 indvar = index(this%anavar, var, type=dtype)
3076 
3077 IF (indvar > 0) THEN
3078  SELECT CASE (dtype)
3079  CASE("d")
3080  vol = realdat(this%volanad(:,indvar,:), var)
3081  CASE("r")
3082  vol = this%volanar(:,indvar,:)
3083  CASE("i")
3084  vol = realdat(this%volanai(:,indvar,:), var)
3085  CASE("b")
3086  vol = realdat(this%volanab(:,indvar,:), var)
3087  CASE("c")
3088  vol = realdat(this%volanac(:,indvar,:), var)
3089  CASE default
3090  vol = rmiss
3091  END SELECT
3092 ELSE
3093  vol = rmiss
3094 ENDIF
3095 
3096 END FUNCTION realanavol
3097 
3098 
3104 FUNCTION integeranavol(this, var) RESULT(vol)
3105 TYPE(vol7d),INTENT(in) :: this
3106 TYPE(vol7d_var),INTENT(in) :: var
3107 INTEGER :: vol(SIZE(this%ana),size(this%network))
3108 
3109 CHARACTER(len=1) :: dtype
3110 INTEGER :: indvar
3111 
3112 dtype = cmiss
3113 indvar = index(this%anavar, var, type=dtype)
3114 
3115 IF (indvar > 0) THEN
3116  SELECT CASE (dtype)
3117  CASE("d")
3118  vol = integerdat(this%volanad(:,indvar,:), var)
3119  CASE("r")
3120  vol = integerdat(this%volanar(:,indvar,:), var)
3121  CASE("i")
3122  vol = this%volanai(:,indvar,:)
3123  CASE("b")
3124  vol = integerdat(this%volanab(:,indvar,:), var)
3125  CASE("c")
3126  vol = integerdat(this%volanac(:,indvar,:), var)
3127  CASE default
3128  vol = imiss
3129  END SELECT
3130 ELSE
3131  vol = imiss
3132 ENDIF
3133 
3134 END FUNCTION integeranavol
3135 
3136 
3142 subroutine move_datac (v7d,&
3143  indana,indtime,indlevel,indtimerange,indnetwork,&
3144  indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew)
3145 
3146 TYPE(vol7d),intent(inout) :: v7d
3147 
3148 integer,intent(in) :: indana,indtime,indlevel,indtimerange,indnetwork
3149 integer,intent(in) :: indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew
3150 integer :: inddativar,inddativarattr
3151 
3152 
3153 do inddativar=1,size(v7d%dativar%c)
3154 
3155  if (c_e(v7d%voldatic(indana,indtime,indlevel,indtimerange,inddativar,indnetwork)) .and. &
3156  .not. c_e(v7d%voldatic(indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew))&
3157  ) then
3158 
3159  ! dati
3160  v7d%voldatic &
3161  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew) = &
3162  v7d%voldatic &
3163  (indana,indtime,indlevel,indtimerange,inddativar,indnetwork)
3164 
3165 
3166  ! attributi
3167  if (associated (v7d%dativarattr%i)) then
3168  inddativarattr = index(v7d%dativarattr%i,v7d%dativar%c(inddativar))
3169  if (inddativarattr > 0 ) then
3170  v7d%voldatiattri &
3171  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3172  v7d%voldatiattri &
3173  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3174  end if
3175  end if
3176 
3177  if (associated (v7d%dativarattr%r)) then
3178  inddativarattr = index(v7d%dativarattr%r,v7d%dativar%c(inddativar))
3179  if (inddativarattr > 0 ) then
3180  v7d%voldatiattrr &
3181  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3182  v7d%voldatiattrr &
3183  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3184  end if
3185  end if
3186 
3187  if (associated (v7d%dativarattr%d)) then
3188  inddativarattr = index(v7d%dativarattr%d,v7d%dativar%c(inddativar))
3189  if (inddativarattr > 0 ) then
3190  v7d%voldatiattrd &
3191  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3192  v7d%voldatiattrd &
3193  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3194  end if
3195  end if
3196 
3197  if (associated (v7d%dativarattr%b)) then
3198  inddativarattr = index(v7d%dativarattr%b,v7d%dativar%c(inddativar))
3199  if (inddativarattr > 0 ) then
3200  v7d%voldatiattrb &
3201  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3202  v7d%voldatiattrb &
3203  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3204  end if
3205  end if
3206 
3207  if (associated (v7d%dativarattr%c)) then
3208  inddativarattr = index(v7d%dativarattr%c,v7d%dativar%c(inddativar))
3209  if (inddativarattr > 0 ) then
3210  v7d%voldatiattrc &
3211  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3212  v7d%voldatiattrc &
3213  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3214  end if
3215  end if
3216 
3217  end if
3218 
3219 end do
3220 
3221 end subroutine move_datac
3222 
3228 subroutine move_datar (v7d,&
3229  indana,indtime,indlevel,indtimerange,indnetwork,&
3230  indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew)
3231 
3232 TYPE(vol7d),intent(inout) :: v7d
3233 
3234 integer,intent(in) :: indana,indtime,indlevel,indtimerange,indnetwork
3235 integer,intent(in) :: indananew,indtimenew,indlevelnew,indtimerangenew,indnetworknew
3236 integer :: inddativar,inddativarattr
3237 
3238 
3239 do inddativar=1,size(v7d%dativar%r)
3240 
3241  if (c_e(v7d%voldatir(indana,indtime,indlevel,indtimerange,inddativar,indnetwork)) .and. &
3242  .not. c_e(v7d%voldatir(indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew))&
3243  ) then
3244 
3245  ! dati
3246  v7d%voldatir &
3247  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativar,indnetworknew) = &
3248  v7d%voldatir &
3249  (indana,indtime,indlevel,indtimerange,inddativar,indnetwork)
3250 
3251 
3252  ! attributi
3253  if (associated (v7d%dativarattr%i)) then
3254  inddativarattr = index(v7d%dativarattr%i,v7d%dativar%r(inddativar))
3255  if (inddativarattr > 0 ) then
3256  v7d%voldatiattri &
3257  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3258  v7d%voldatiattri &
3259  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3260  end if
3261  end if
3262 
3263  if (associated (v7d%dativarattr%r)) then
3264  inddativarattr = index(v7d%dativarattr%r,v7d%dativar%r(inddativar))
3265  if (inddativarattr > 0 ) then
3266  v7d%voldatiattrr &
3267  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3268  v7d%voldatiattrr &
3269  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3270  end if
3271  end if
3272 
3273  if (associated (v7d%dativarattr%d)) then
3274  inddativarattr = index(v7d%dativarattr%d,v7d%dativar%r(inddativar))
3275  if (inddativarattr > 0 ) then
3276  v7d%voldatiattrd &
3277  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3278  v7d%voldatiattrd &
3279  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3280  end if
3281  end if
3282 
3283  if (associated (v7d%dativarattr%b)) then
3284  inddativarattr = index(v7d%dativarattr%b,v7d%dativar%r(inddativar))
3285  if (inddativarattr > 0 ) then
3286  v7d%voldatiattrb &
3287  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3288  v7d%voldatiattrb &
3289  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3290  end if
3291  end if
3292 
3293  if (associated (v7d%dativarattr%c)) then
3294  inddativarattr = index(v7d%dativarattr%c,v7d%dativar%r(inddativar))
3295  if (inddativarattr > 0 ) then
3296  v7d%voldatiattrc &
3297  (indananew,indtimenew,indlevelnew,indtimerangenew,inddativarattr,indnetworknew,:) = &
3298  v7d%voldatiattrc &
3299  (indana,indtime,indlevel,indtimerange,inddativarattr,indnetwork,:)
3300  end if
3301  end if
3302 
3303  end if
3304 
3305 end do
3306 
3307 end subroutine move_datar
3308 
3309 
3323 subroutine v7d_rounding(v7din,v7dout,level,timerange,nostatproc)
3324 type(vol7d),intent(inout) :: v7din
3325 type(vol7d),intent(out) :: v7dout
3326 type(vol7d_level),intent(in),optional :: level(:)
3327 type(vol7d_timerange),intent(in),optional :: timerange(:)
3328 !logical,intent(in),optional :: merge !< if there are data on more then one almost equal levels or timeranges
3329 !! will be merged POINT BY POINT with priority for the fird data found ordered by icreasing var index
3330 logical,intent(in),optional :: nostatproc
3331 
3332 integer :: nana,nlevel,ntime,ntimerange,nnetwork,nbin
3333 integer :: iana,ilevel,itimerange,indl,indt,itime,inetwork
3334 type(vol7d_level) :: roundlevel(size(v7din%level))
3335 type(vol7d_timerange) :: roundtimerange(size(v7din%timerange))
3336 type(vol7d) :: v7d_tmp
3337 
3338 
3339 nbin=0
3340 
3341 if (associated(v7din%dativar%r)) nbin = nbin + size(v7din%dativar%r)
3342 if (associated(v7din%dativar%i)) nbin = nbin + size(v7din%dativar%i)
3343 if (associated(v7din%dativar%d)) nbin = nbin + size(v7din%dativar%d)
3344 if (associated(v7din%dativar%b)) nbin = nbin + size(v7din%dativar%b)
3345 
3346 call init(v7d_tmp)
3347 
3348 roundlevel=v7din%level
3349 
3350 if (present(level))then
3351  do ilevel = 1, size(v7din%level)
3352  if ((any(v7din%level(ilevel) .almosteq. level))) then
3353  roundlevel(ilevel)=level(1)
3354  end if
3355  end do
3356 end if
3357 
3358 roundtimerange=v7din%timerange
3359 
3360 if (present(timerange))then
3361  do itimerange = 1, size(v7din%timerange)
3362  if ((any(v7din%timerange(itimerange) .almosteq. timerange))) then
3363  roundtimerange(itimerange)=timerange(1)
3364  end if
3365  end do
3366 end if
3367 
3368 !set istantaneous values everywere
3369 !preserve p1 for forecast time
3370 if (optio_log(nostatproc)) then
3371  roundtimerange(:)%timerange=254
3372  roundtimerange(:)%p2=0
3373 end if
3374 
3375 
3376 nana=size(v7din%ana)
3377 nlevel=count_distinct(roundlevel,back=.true.)
3378 ntime=size(v7din%time)
3379 ntimerange=count_distinct(roundtimerange,back=.true.)
3380 nnetwork=size(v7din%network)
3381 
3382 call init(v7d_tmp)
3383 
3384 if (nbin == 0) then
3385  call copy(v7din,v7d_tmp)
3386 else
3387  call vol7d_convr(v7din,v7d_tmp)
3388 end if
3389 
3390 v7d_tmp%level=roundlevel
3391 v7d_tmp%timerange=roundtimerange
3392 
3393 do ilevel=1, size(v7d_tmp%level)
3394  indl=index(v7d_tmp%level,roundlevel(ilevel))
3395  do itimerange=1,size(v7d_tmp%timerange)
3396  indt=index(v7d_tmp%timerange,roundtimerange(itimerange))
3397 
3398  if (indl /= ilevel .or. indt /= itimerange) then
3399 
3400  do iana=1, nana
3401  do itime=1,ntime
3402  do inetwork=1,nnetwork
3403 
3404  if (nbin > 0) then
3405  call move_datar (v7d_tmp,&
3406  iana,itime,ilevel,itimerange,inetwork,&
3407  iana,itime,indl,indt,inetwork)
3408  else
3409  call move_datac (v7d_tmp,&
3410  iana,itime,ilevel,itimerange,inetwork,&
3411  iana,itime,indl,indt,inetwork)
3412  end if
3413 
3414  end do
3415  end do
3416  end do
3417 
3418  end if
3419 
3420  end do
3421 end do
3422 
3423 ! set to missing level and time > nlevel
3424 do ilevel=nlevel+1,size(v7d_tmp%level)
3425  call init (v7d_tmp%level(ilevel))
3426 end do
3427 
3428 do itimerange=ntimerange+1,size(v7d_tmp%timerange)
3429  call init (v7d_tmp%timerange(itimerange))
3430 end do
3431 
3432 !copy with remove
3433 CALL copy(v7d_tmp,v7dout,miss=.true.,lsort_timerange=.true.,lsort_level=.true.)
3434 CALL delete(v7d_tmp)
3435 
3436 !call display(v7dout)
3437 
3438 end subroutine v7d_rounding
3439 
3440 
3441 END MODULE vol7d_class
3442 
3448 
3449 
Classe per gestire un vettore di oggetti di tipo vol7d_var_class::vol7d_var.
Lettura da file.
Legge un oggetto datetime/timedelta o un vettore di oggetti datetime/timedelta da un file FORMATTED o...
Set of functions that return a trimmed CHARACTER representation of the input variable.
Distruttore per la classe vol7d.
Module for quickly interpreting the OPTIONAL parameters passed to a subprogram.
copy object
Classe per la gestione dell&#39;anagrafica di stazioni meteo e affini.
Represent data in a pretty string.
doubleprecision data conversion
Classi per la gestione delle coordinate temporali.
Scrittura su file.
Costruttore per la classe vol7d.
Reduce some dimensions (level and timerage) for semplification (rounding).
Scrive un oggetto datetime/timedelta o un vettore di oggetti datetime/timedelta su un file FORMATTED ...
Generic subroutine for checking OPTIONAL parameters.
Print object.
Test for a missing volume.
Index method.
Classe per la gestione dei livelli verticali in osservazioni meteo e affini.
Classe per la gestione delle reti di stazioni per osservazioni meteo e affini.
Gestione degli errori.
Classe per la gestione di un volume completo di dati osservati.
Definisce un oggetto contenente i volumi anagrafica e dati e tutti i descrittori delle loro dimension...
This module defines usefull general purpose function and subroutine.
Classe per la gestione degli intervalli temporali di osservazioni meteo e affini. ...
classe per la gestione del logging
Definition of constants related to I/O units.
Definition: io_units.F90:235
real data conversion
Utilities for CHARACTER variables.
integer data conversion
Check for problems return 0 if all check passed print diagnostics with log4f.
Definition of constants to be used for declaring variables of a desired type.
Definition: kinds.F90:255

Generated with Doxygen.