SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
outer_product.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 SUBROUTINE outer_product(KENS,KX,KY,PX,PY,PA,PC,OPB_CORRELATIONS,HVAR,HOBS)
6 !---------------------------------------------------------
7 !
8 ! Computes the outer product of two vectors X and Y
9 ! to produce a matrix A = XY**T
10 !
11 !
12 ! Jean-Francois MAHFOUF (11/06)
13 !--------------------------------------------------------
14 !
15 USE yomhook ,ONLY : lhook, dr_hook
16 USE parkind1 ,ONLY : jprb
17 !
18 IMPLICIT NONE
19 !
20 INTEGER, INTENT(IN) :: kens, kx, ky
21 LOGICAL, INTENT(IN) :: opb_correlations
22  CHARACTER(LEN=3), DIMENSION(KX), INTENT(IN) :: hvar
23  CHARACTER(LEN=3), DIMENSION(KY), INTENT(IN) :: hobs
24 REAL, DIMENSION(KX,KENS), INTENT(IN) :: px
25 REAL, DIMENSION(KY,KENS), INTENT(IN) :: py
26 REAL, DIMENSION(KX,KY), INTENT(OUT) :: pa
27 REAL, DIMENSION(KY,KY), INTENT(OUT) :: pc
28 !
29 REAL, DIMENSION(KX,KENS) :: zxpert
30 REAL, DIMENSION(KY,KENS) :: zypert
31 REAL, DIMENSION(KENS,KY) :: zyt
32 REAL, DIMENSION(KX) :: zxm
33 REAL, DIMENSION(KY) :: zym
34 !
35 INTEGER :: i, k, l
36 !
37 REAL(KIND=JPRB) :: zhook_handle
38 !
39 IF (lhook) CALL dr_hook('OUTER_PRODUCT',0,zhook_handle)
40 !
41 DO l = 1,kx
42  !
43  zxm(l) = sum(px(l,:))/REAL(kens)!MEAN
44  zxpert(l,:) = px(l,:)-zxm(l) !ANOMALY
45  !
46 ENDDO
47 !
48 DO k = 1,ky
49  zym(k) = sum(py(k,:))/REAL(kens)
50  zypert(k,:) = py(k,:)-zym(k)
51 ENDDO
52 !
53 IF (opb_correlations) THEN
54  !For 2D EnKF
55  pa(:,:)=matmul(zxpert(:,:),transpose(zypert(:,:)))
56  pc(:,:)=matmul(zypert(:,:),transpose(zypert(:,:)))
57  !
58 ELSE
59  !For 1D EnKF
60  DO l = 1,kx
61  DO k = 1,ky
62  IF (hvar(l).EQ.hobs(k)) THEN
63  pa(l,k) = dot_product(zxpert(l,:),zypert(k,:))
64  ELSE
65  pa(l,k) = 0.0
66  ENDIF
67  ENDDO
68  ENDDO
69 ENDIF
70 !
71 pa = pa / REAL(kens - 1)
72 pc = pc / REAL(kens - 1)
73 !
74 IF (lhook) CALL dr_hook('OUTER_PRODUCT',1,zhook_handle)
75 !
76 END SUBROUTINE outer_product
subroutine outer_product(KENS, KX, KY, PX, PY, PA, PC, OPB_CORRELATIONS, HVAR, HOBS)