Merge pull request #22 from wirc-sjsu/develop-w21
[WRF-SFIRE.git] / dyn_em / module_avgflx_em.F
blob5db0de0d8425bd9ff99fcbd47647b73143527c3f
1 !WRF:MODEL_LAYER:DYNAMICS
3 MODULE module_avgflx_em
5   USE module_bc
6   USE module_model_constants
7   USE module_wrf_error
9 CONTAINS
11 !-------------------------------------------------------------------------------
14   subroutine zero_avgflx(avgflx_rum,avgflx_rvm,avgflx_wwm, &
15        & ids, ide, jds, jde, kds, kde,           &
16        & ims, ime, jms, jme, kms, kme,           &
17        & its, ite, jts, jte, kts, kte, do_cu,    &
18        & avgflx_cfu1,avgflx_cfd1,avgflx_dfu1,avgflx_efu1,avgflx_dfd1,avgflx_efd1 )
20     IMPLICIT NONE
22     INTEGER , INTENT(IN)        :: ids, ide, jds, jde, kds, kde,  &
23          ims, ime, jms, jme, kms, kme,  &
24          its, ite, jts, jte, kts, kte
26     LOGICAL, INTENT(IN) :: do_cu
28     REAL,     DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) ::    &
29          avgflx_rum,avgflx_rvm,avgflx_wwm
31     REAL,     OPTIONAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) ::    &
32          avgflx_cfu1,avgflx_cfd1,avgflx_dfu1,avgflx_efu1,avgflx_dfd1,avgflx_efd1
34     INTEGER :: i,j,k
36     DO j=jts,jte
37        DO k=kts,kte
38           DO i=its,ite
39              avgflx_rum(i,k,j) = 0.
40              avgflx_rvm(i,k,j) = 0.
41              avgflx_wwm(i,k,j) = 0.
42           end DO
43        end DO
44     end DO
46     if (do_cu .and. &
47          & present(avgflx_cfu1) .and. present(avgflx_cfd1) .and. present(avgflx_dfu1) &
48          & .and. present(avgflx_efu1) .and. present(avgflx_dfd1) .and. present(avgflx_efd1) ) then
49        DO j=jts,jte
50           DO k=kts,kte
51              DO i=its,ite
52                 avgflx_cfu1(i,k,j) = 0.
53                 avgflx_cfd1(i,k,j) = 0.
54                 avgflx_dfu1(i,k,j) = 0.
55                 avgflx_efu1(i,k,j) = 0.
56                 avgflx_dfd1(i,k,j) = 0.
57                 avgflx_efd1(i,k,j) = 0.
58              end DO
59           end DO
60        end DO
61     end if
63     return
64   end subroutine zero_avgflx
66   subroutine upd_avgflx(avgflx_count,avgflx_rum,avgflx_rvm,avgflx_wwm, &
67        &   ru_m, rv_m, ww_m, &
68        & ids, ide, jds, jde, kds, kde,           &
69        & ims, ime, jms, jme, kms, kme,           &
70        & its, ite, jts, jte, kts, kte, do_cu,    &
71        & cfu1,cfd1,dfu1,efu1,dfd1,efd1,          &
72        & avgflx_cfu1,avgflx_cfd1,avgflx_dfu1,avgflx_efu1,avgflx_dfd1,avgflx_efd1 )
74     IMPLICIT NONE
76     INTEGER , INTENT(IN)        :: ids, ide, jds, jde, kds, kde,  &
77          ims, ime, jms, jme, kms, kme,  &
78          its, ite, jts, jte, kts, kte
80     INTEGER , INTENT(IN)        :: avgflx_count
81     LOGICAL, INTENT(IN) :: do_cu
82     REAL, DIMENSION(ims:ime, kms:kme, jms:jme) , INTENT(IN) :: ru_m, &
83          rv_m, &
84          ww_m
86     REAL,     DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) ::    &
87          avgflx_rum,avgflx_rvm,avgflx_wwm
89     REAL,     OPTIONAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(IN) ::    &
90          cfu1,cfd1,dfu1,efu1,dfd1,efd1
91     REAL,     OPTIONAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , INTENT(INOUT) ::    &
92          avgflx_cfu1,avgflx_cfd1,avgflx_dfu1,avgflx_efu1,avgflx_dfd1,avgflx_efd1
94     INTEGER :: i,j,k
95     REAL :: local_count
97     local_count = real(avgflx_count)
98     DO j=jts,jte
99        DO k=kts,kte
100           DO i=its,ite
101              avgflx_rum(i,k,j) = (local_count*avgflx_rum(i,k,j) + ru_m(i,k,j))/(local_count+1.)
102              avgflx_rvm(i,k,j) = (local_count*avgflx_rvm(i,k,j) + rv_m(i,k,j))/(local_count+1.)
103              avgflx_wwm(i,k,j) = (local_count*avgflx_wwm(i,k,j) + ww_m(i,k,j))/(local_count+1.)
104           end DO
105        end DO
106     end DO
108     if (do_cu .and. &
109          & present(avgflx_cfu1) .and. present(avgflx_cfd1) .and. present(avgflx_dfu1) &
110          & .and. present(avgflx_efu1) .and. present(avgflx_dfd1) .and. present(avgflx_efd1) &
111          & .and. present(cfu1) .and. present(cfd1) .and. present(dfu1) &
112          & .and. present(efu1) .and. present(dfd1) .and. present(efd1) ) then
113        DO j=jts,jte
114           DO k=kts,kte
115              DO i=its,ite
116                 avgflx_cfu1(i,k,j) = (local_count*avgflx_cfu1(i,k,j) + &
117                      & cfu1(i,k,j)) / (local_count+1.)
118                 avgflx_cfd1(i,k,j) = (local_count*avgflx_cfd1(i,k,j) + &
119                      & cfd1(i,k,j)) / (local_count+1.)
120                 avgflx_dfu1(i,k,j) = (local_count*avgflx_dfu1(i,k,j) + &
121                      & dfu1(i,k,j)) / (local_count+1.)
122                 avgflx_efu1(i,k,j) = (local_count*avgflx_efu1(i,k,j) + &
123                      & efu1(i,k,j)) / (local_count+1.)
124                 avgflx_dfd1(i,k,j) = (local_count*avgflx_dfd1(i,k,j) + &
125                      & dfd1(i,k,j)) / (local_count+1.)
126                 avgflx_efd1(i,k,j) = (local_count*avgflx_efd1(i,k,j) + &
127                      & efd1(i,k,j)) / (local_count+1.)
128              end DO
129           end DO
130        end DO
131     end if
133     return
134   end subroutine upd_avgflx
135 end MODULE module_avgflx_em