|
◆ quacontem()
subroutine, public modqctem::quacontem |
( |
type(qctemtype), intent(inout) |
qctem, |
|
|
character (len=10), intent(in), optional |
battrinv, |
|
|
character (len=10), intent(in), optional |
battrcli, |
|
|
character (len=10), intent(in), optional |
battrout, |
|
|
logical, dimension(:), intent(in), optional |
anamask, |
|
|
logical, dimension(:), intent(in), optional |
timemask, |
|
|
logical, dimension(:), intent(in), optional |
levelmask, |
|
|
logical, dimension(:), intent(in), optional |
timerangemask, |
|
|
logical, dimension(:), intent(in), optional |
varmask, |
|
|
logical, dimension(:), intent(in), optional |
networkmask |
|
) |
| |
Controllo di Qualità temporale.
Questo è il vero e proprio controllo di qualità temporale. - Parametri
-
[in,out] | qctem | Oggetto per il controllo di qualità |
[in] | battrinv | attributo invalidated in input |
[in] | battrcli | attributo con la confidenza climatologica in input |
[in] | battrout | attributo con la confidenza temporale in output |
[in] | anamask | Filtro sulle anagrafiche |
[in] | timemask | Filtro sul tempo |
[in] | levelmask | Filtro sui livelli |
[in] | timerangemask | filtro sui timerange |
[in] | varmask | Filtro sulle variabili |
[in] | networkmask | Filtro sui network |
Definizione alla linea 551 del file modqctem.F90.
553 if (indbattrinv > 0) then
554 if( invalidated(qctem%v7d%voldatiattrb&
555 (indana,indtime,indlevel,indtimerange,inddativarr,indnetwork then
556 call l4f_category_log(qctem%category,l4f_warn,&
557 "It's better to do a reform on ana to v7d after peeling, before spatial QC"
563 if (indbattrcli > 0) then
564 if( .not. vdge(qctem%v7d%voldatiattrb&
565 (indana,indtime,indlevel,indtimerange,inddativarr,indnetwork then
566 call l4f_category_log(qctem%category,l4f_warn,&
567 "It's better to do a reform on ana to v7d after peeling, before spatial QC"
574 if (qctem%operation == "run") then
576 indclevel = index(qctem%clima%level
577 indctimerange = index(qctem%clima%timerange
581 indcdativarr = index(qctem%clima%dativar%r, qctem%v7d%dativar%r
584 call l4f_log(l4f_debug, "QCtem Index:"// to_char(indctime)/
585 to_char(indctimerange)//to_char(indcdativarr)//to_char(indcnetworks
587 if ( indctime <= 0 .or. indclevel <= 0 .or. indctimerange
588 .or. indcnetworks <= 0 ) cycle
597 indtimenear=indtime-1
598 datoprima = qctem%v7d%voldatir (indana ,indtimenear ,indlevel
599 prima = qctem%v7d%time (indtimenear)
602 if (indbattrinv > 0) then
603 if( invalidated(qctem%v7d%voldatiattrb&
604 (indana,indtimenear,indlevel,indtimerange,inddativarr,indnetwork then
610 if (indbattrcli > 0) then
611 if( .not. vdge(qctem%v7d%voldatiattrb&
612 (indana,indtimenear,indlevel,indtimerange,inddativarr,indnetwork then
619 indtimenear=indtime+1
620 datodopo = qctem%v7d%voldatir (indana ,indtimenear ,indlevel
621 dopo = qctem%v7d%time (indtimenear)
624 if (indbattrinv > 0) then
625 if( invalidated(qctem%v7d%voldatiattrb&
626 (indana,indtimenear,indlevel,indtimerange,inddativarr,indnetwork then
632 if (indbattrcli > 0) then
633 if( .not. vdge(qctem%v7d%voldatiattrb&
634 (indana,indtimenear,indlevel,indtimerange,inddativarr,indnetwork then
640 IF(.NOT.c_e(datoprima) .and. .NOT.c_e(datodopo) ) cycle
648 call getval(td,asec=asec)
649 if ((c_e(qctem%timeconfidence) .and. asec <= qctem%timeconfidence
650 .not. c_e(qctem%timeconfidence)) then
651 if (c_e(datoprima)) gradprima=(datoqui-datoprima) / dble(asec
655 call getval(td,asec=asec)
656 if ((c_e(qctem%timeconfidence) .and. asec <= qctem%timeconfidence
657 .not. c_e(qctem%timeconfidence)) then
658 if (c_e(datodopo)) graddopo =(datodopo-datoqui ) / dble(asec
663 call l4f_log(l4f_debug, "QCtem gradprima:"// to_char(gradprima " graddopo:"
666 IF(.NOT.c_e(gradprima) .and. .NOT.c_e(graddopo) ) cycle
671 IF(.NOT.c_e(gradprima) ) then
674 grad= sign(abs(graddopo),-1.d0)
676 else IF(.NOT.c_e(graddopo) ) then
679 grad= sign(abs(gradprima),-1.d0)
683 if (abs(max(abs(gradprima),abs(graddopo))-min(abs(gradprima
684 max(abs(gradprima),abs(graddopo))/2. .and. (sign(1.d0,gradprima then
686 grad= min(abs(gradprima),abs(graddopo))
689 grad= sign(max(abs(gradprima),abs(graddopo)),-1.d0)
693 if (qctem%operation == "gradient") then
698 if (qctem%operation == "run") then
703 call l4f_log(l4f_debug, "QCtem choice gradient type: spike"
705 indcnetwork=indcnetworks
708 call l4f_log(l4f_debug, "QCtem choice gradient type: gradmax"
710 indcnetwork=indcnetworkg
714 call l4f_log(l4f_debug, "gradiente da confrontare con QCtem clima:"
716 do indcana=1, size(qctem%clima%ana)
718 climaquii=(qctem%clima%voldatir(indcana &
719 ,indctime,indclevel,indctimerange,indcdativarr,indcnetwork
720 -tem_b(ind))/tem_a(ind)
722 climaquif=(qctem%clima%voldatir(min(indcana+1, size(qctem%clima%ana
723 ,indctime,indclevel,indctimerange,indcdativarr,indcnetwork
724 -tem_b(ind))/tem_a(ind)
727 call l4f_log(l4f_debug, "QCtem clima start:"//t2c(climaquii
728 call l4f_log(l4f_debug, "QCtem clima end:"//t2c(climaquif
730 if ( c_e(climaquii) .and. c_e(climaquif )) then
732 if ( (grad >= climaquii .and. grad < climaquif) .or. &
733 (indcana == 1 .and. grad < climaquii) .or. &
734 (indcana == size(qctem%clima%ana) .and. grad >= climaquif then
737 call l4f_log(l4f_debug, "QCtem confidence:"// t2c(qctem%clima%voldatiattrb
738 (indcana,indctime,indclevel,indctimerange,indcdativarr,indcnetwork
741 qctem%v7d%voldatiattrb( indana, indtime, indlevel,
742 qctem%clima%voldatiattrb(indcana,indctime,indclevel
744 if ( associated ( qctem%data_id_in)) then
746 call l4f_log (l4f_debug, "id: "//t2c(&
747 qctem%data_id_in(indana,indtime,indlevel,indtimerange
749 qctem%data_id_out(indana,indtime,indlevel,indtimerange
750 qctem%data_id_in(indana,indtime,indlevel,indtimerange
762 if (qctem%operation == "gradient") then
774 end subroutine quacontem
Controllo di qualità temporale.
|