SURFEX v8.1
General documentation of Surfex
factec.F90
Go to the documentation of this file.
1 ! Oct-2012 P. Marguinaud 64b LFI
2 ! Jan-2011 P. Marguinaud Thread-safe FA
3 SUBROUTINE factec_fort &
4 & (fa, krep, pa, knbit, kdec, ke, knutil)
5 USE fa_mod, ONLY : fa_com
6 USE parkind1, ONLY : jprb
7 USE yomhook , ONLY : lhook, dr_hook
9 IMPLICIT NONE
10 !****
11 ! Sous-programme de calcul du FACTeur d'EChelle binaire associe
12 ! a un champ d'amplitude donnee, code sur KNBIT bits.
13 !**
14 ! Arguments : KREP (Sortie) ==> Code-reponse du sous-programme;
15 ! PA (Entree) ==> Amplitude du champ a compacter;
16 ! KNBIT (Entree) ==> Nb de bits servant au compactage;
17 ! KDEC (Entree) ==> Facteur d'echelle decimal;
18 ! KE (Sortie) ==> Facteur d'echelle binaire;
19 ! KNUTIL (Sortie) ==> Nombre d'entiers utilises pour
20 ! representer le champ.
21 !
22 ! Modifications:
23 !
24 TYPE(fa_com) :: FA
25 REAL (KIND=JPDBLR) PA
26 INTEGER (KIND=JPLIKB) KREP, KNBIT, KDEC, KE, KNUTIL
27 !
28 REAL (KIND=JPDBLR) ZTWO, ZHALF, ZTEN
29 
30 !
31 !**
32 ! 1. - CONTROLES ET INITIALISATIONS.
33 !-----------------------------------------------------------------------
34 !
35 REAL(KIND=JPRB) :: ZHOOK_HANDLE
36 IF (lhook) CALL dr_hook('FACTEC_MT',0,zhook_handle)
37 ztwo = 2._jpdblr
38 zhalf = 0.5_jpdblr
39 zten = 10._jpdblr
40 krep = 0
41 ke = 0
42 knutil = 0
43 IF (knbit.LE.0 .OR. knbit.GT.64) THEN
44  krep=-1
45  WRITE (unit=fa%NULOUT,fmt=*)'****'
46  WRITE (unit=fa%NULOUT,fmt=*) &
47 & '**** FACTEC: ERROR, bits number out of range 1-64'
48  WRITE (unit=fa%NULOUT,fmt=*)'**** KNBIT = ',knbit
49  WRITE (unit=fa%NULOUT,fmt=*) &
50 & '**** Binary scale factor is not computed !!'
51  WRITE (unit=fa%NULOUT,fmt=*)'****'
52  GOTO 1001
53 ENDIF
54 IF ( abs(pa).LT.tiny(pa) ) THEN
55  WRITE (unit=fa%NULOUT,fmt=*)'----'
56  WRITE (unit=fa%NULOUT,fmt=*) &
57 & '---- FACTEC: Warning, the range of the field is', &
58 & ' considered as zero'
59  WRITE (unit=fa%NULOUT,fmt=*)'----'
60  ke = 0
61  knutil = 1
62  GOTO 1001
63 ENDIF
64 IF ( abs(log10(abs(pa))+real(kdec, jpdblr)) &
65 & .GE. REAL (RANGE(PA), JPDBLR) ) then
66  krep=-1
67  WRITE (unit=fa%NULOUT,fmt=*)'****'
68  WRITE (unit=fa%NULOUT,fmt=*) &
69 & '**** FACTEC: ERROR, PA*10**KDEC exceeds real', &
70 & 'representation of KIND=',jpdblr
71  WRITE (unit=fa%NULOUT,fmt=*) &
72 & '**** LOG10(ABS(PA)), KDEC, RANGE(PA) = ', &
73 & log10(abs(pa)), kdec, range(pa)
74  WRITE (unit=fa%NULOUT,fmt=*) &
75 & '**** Binary scale factor is not computed !!'
76  WRITE (unit=fa%NULOUT,fmt=*)'****'
77  GOTO 1001
78 ENDIF
79 !
80 !**
81 ! 2. - CALCUL DU FACTEUR D'ECHELLE BINAIRE
82 !-----------------------------------------------------------------------
83 !
84 ke = floor( log( (pa*10._8**kdec) / &
85 & (2._8**knbit-0.5_8) )/log(2._8), &
86 & kind=jplikb ) + 1
87 knutil = floor( 0.5_8 + pa*(10._8**kdec)*(2._8**(-ke)), &
88 & kind=jplikb )
89 
90 1001 CONTINUE
91 
92 IF (lhook) CALL dr_hook('FACTEC_MT',1,zhook_handle)
93 END SUBROUTINE
94 
95 
96 !INTF KREP OUT
97 !INTF PA IN
98 !INTF KNBIT IN
99 !INTF KDEC IN
100 !INTF KE OUT
101 !INTF KNUTIL OUT
subroutine factec_fort(FA, KREP, PA, KNBIT, KDEC, KE, KNUTIL)
Definition: factec.F90:5
integer, parameter jplikb
Definition: fa_mod.F90:1
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter jpdblr
logical lhook
Definition: yomhook.F90:15
real8 real
Definition: privpub.h:396