source: CPL/oasis3/trunk/src/mod/oasis3/src/conserv.f @ 1677

Last change on this file since 1677 was 1677, checked in by aclsce, 12 years ago

Imported oasis3 (tag ipslcm5a) from cvs server to svn server (igcmg project).

File size: 5.6 KB
Line 
1      SUBROUTINE conserv (pfldb, ksizb, kmskb, psurfb,
2     $                    pflda, ksiza, kmska, psurfa, 
3     $                    psgrb, psgra, cdmet)
4C****
5C               *****************************
6C               * OASIS ROUTINE  -  LEVEL 3 *
7C               * -------------     ------- *
8C               *****************************
9C
10C**** *conserv* - Flux conservation routine
11C
12C     Purpose:
13C     -------
14C     Use global lagrange multiplier to insure conservation
15C
16C**   Interface:
17C     ---------
18C       *CALL*  *conserv (pfldb, ksizb, kmskb, psurfb,
19C                         pflda, ksiza, kmska, psurfa, cdmet)*
20C
21C     Input:
22C     -----
23C                pflda  : field on target grid (real 1D)
24C                pfldb  : field on source grid (real 1D)
25C                kmska  : mask for target grid (integer 1D)
26C                kmskb  : mask for source grid (integer 1D)
27C                psurfa : surfaces for target grid meshes (real 1D)
28C                psurfb : surfaces for source grid meshes (real 1D)
29C                ksizb  : source arrays size (integer)
30C                ksiza  : target arrays size (integer)
31C                psgrb  : work array (real 1D)
32C                psgra  : work array (real 1D)
33C                cdmet  : conservation method (character string)
34C
35C     Output:
36C     ------
37C                pflda  : field on target grid with conservation (real 1D)
38C
39C     Workspace:
40C     ---------
41C     None
42C
43C     Externals:
44C     ---------
45C     None
46C
47C     Reference:
48C     ---------
49C     See OASIS manual (2000)
50C
51C     History:
52C     -------
53C       Version   Programmer     Date      Description
54C       -------   ----------     ----      ----------- 
55C       1.0       L. Terray      94/01/01  created
56C       2.0       L. Terray      95/10/01  modified: new structure
57C       2.1       L. Terray      96/09/01  modified: printing
58C       2.3       S. Valcke      99/04/30  added: printing levels
59C       2.4       S. Legutke     00/07/12  conservation calculation
60C
61C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
62C
63C* ---------------------------- Include files ---------------------------
64C
65      USE mod_kinds_oasis
66      USE mod_unit
67      USE mod_printing
68C
69C* ---------------------------- Argument declarations -------------------
70C
71      REAL (kind=ip_realwp_p) pflda(ksiza), pfldb(ksizb)
72      REAL (kind=ip_realwp_p) psurfa(ksiza), psurfb(ksizb)
73      REAL (kind=ip_realwp_p) psgra(ksiza), psgrb(ksizb)
74      INTEGER (kind=ip_intwp_p) kmska(ksiza), kmskb(ksizb)
75      CHARACTER*8 cdmet
76C
77C* ---------------------------- Poema verses ----------------------------
78C
79C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80C
81C*    1. Initialization
82C        --------------
83C
84      IF (nlogprt .GE. 2) THEN
85          WRITE (UNIT = nulou,FMT = *) ' '
86          WRITE (UNIT = nulou,FMT = *) ' '
87          WRITE (UNIT = nulou,FMT = *) 
88     $    '           ROUTINE conserv  -  Level 3'
89          WRITE (UNIT = nulou,FMT = *) 
90     $    '           ***************     *******'
91          WRITE (UNIT = nulou,FMT = *) ' '
92          WRITE (UNIT = nulou,FMT = *) 
93     $    ' Global or local flux conservation'
94          WRITE (UNIT = nulou,FMT = *) ' '
95          WRITE (UNIT = nulou,FMT = *) ' '
96      ENDIF
97      zrad = 6371229.
98      zrad2 = zrad * zrad
99      zradi = 1./zrad2
100
101C
102C
103C*    2. Calculate mesh surfaces
104C        -----------------------
105C
106      DO 210 ji = 1, ksiza
107        psgra(ji) = psurfa(ji) * zradi
108 210  CONTINUE
109      DO 220 ji = 1, ksizb
110        psgrb(ji) = psurfb(ji) * zradi
111 220  CONTINUE
112C
113C
114C*    3. Lagrange multiplier for global conservation
115C        -------------------------------------------
116C
117      IF (cdmet .EQ. 'GLOBAL') THEN
118          zflxa = 0.
119          ztsqi = 0.
120C
121C* Sum up flux on target grid
122C
123          DO 310 ji = 1, ksiza
124            IF (kmska(ji) .eq. 0) THEN
125                zflxa = zflxa + psgra(ji) * pflda(ji)
126CSL                ztsqi = ztsqi + psgra(ji) * psgra(ji)
127                ztsqi = ztsqi + psgra(ji)
128            ENDIF
129 310      CONTINUE
130C
131C* Sum up flux on source grid
132C
133          zflxb = 0.
134          DO 320 ji = 1, ksizb
135            IF (kmskb(ji) .eq. 0) THEN
136                zflxb = zflxb + psgrb(ji) * pfldb(ji)
137            ENDIF
138 320      CONTINUE
139C
140C* Get global correction
141C
142          zlagr = (zflxa - zflxb) / ztsqi
143C
144C* Constrained solution: the error is uniformly shared between sea points
145C
146          DO 330 ji = 1, ksiza
147            IF (kmska(ji) .EQ. 0) THEN
148CSL                pflda(ji) = pflda(ji) - zlagr * psgra(ji)
149                pflda(ji) = pflda(ji) - zlagr
150            ENDIF
151 330      CONTINUE
152C
153C* Printing test
154C
155          zflxn = 0.
156          DO 340 ji = 1, ksiza
157            IF (kmska(ji) .eq. 0) THEN
158                zflxn = zflxn + psgra(ji) * pflda(ji)
159            ENDIF
160 340      CONTINUE
161          IF (nlogprt .GE. 2) THEN
162              WRITE (UNIT = nulou,FMT = *) 
163     $        ' Printing check for flux conservation '
164              WRITE (UNIT = nulou,FMT = *) ' '
165              WRITE (UNIT = nulou,FMT = *) 
166     $        ' Total flux on source grid ZFLXB = ',zflxb
167              WRITE (UNIT = nulou,FMT = *) 
168     $        ' Total flux on target grid ZFLXA = ',zflxa
169              WRITE (UNIT = nulou,FMT = *) 
170     $        ' Idem after conservation   ZFLXN = ',zflxn
171              WRITE (UNIT = nulou,FMT = *) ' '
172          ENDIF
173      ENDIF
174C
175C
176C*    4. End of routine
177C        --------------
178C
179      IF (nlogprt .GE. 2) THEN
180          WRITE (UNIT = nulou,FMT = *) ' '
181          WRITE (UNIT = nulou,FMT = *) 
182     $    '          --------- End of routine conserv ---------'
183          CALL FLUSH (nulou)
184      ENDIF
185      RETURN
186      END
Note: See TracBrowser for help on using the repository browser.