New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
sol_oce_tam.F90 in NEMO/branches/NERC/dev_release-3.4_NEMOTAM_consolidated/NEMOGCM/NEMO/OPATAM_SRC/SOL – NEMO

source: NEMO/branches/NERC/dev_release-3.4_NEMOTAM_consolidated/NEMOGCM/NEMO/OPATAM_SRC/SOL/sol_oce_tam.F90 @ 13432

Last change on this file since 13432 was 13432, checked in by smueller, 4 years ago

Fixing of the number of iterations carried out by the tangent-linear SOR solver to the default number of iterations carried out by its adjoint

  • Property svn:executable set to *
File size: 7.1 KB
Line 
1MODULE sol_oce_tam
2   !!======================================================================
3   !!                    ***  MODULE  sol_oce_tam  ***
4   !! NEMOVAR : variables controlling the solver for tangent and adjoint models
5   !!======================================================================
6   !! History of the direct module:
7   !!            1.0  ! 2002-11  (G. Madec)  F90: Free form and module
8   !!            4.0  ! 2011-01  (A. R. Porter, STFC Daresbury) dynamical allocation
9   !! History of the TAM module:
10   !!            9.0  !  09-03  (A. Weaver) original version
11   !!       NEMO 3.4  ! 2012-04 (P.-A. Bouttier) update
12   !!       NEMO 3.4  ! 2012-09 (A. Vidard) Deallocating and initialising options
13   !!----------------------------------------------------------------------
14
15   !!----------------------------------------------------------------------
16   !!   sol_oce_alloc : allocate the solver arrays
17   !!----------------------------------------------------------------------
18   USE par_oce        ! ocean parameters
19   USE in_out_manager ! I/O manager
20   USE lib_mpp        ! distributed memory computing
21   USE sol_oce
22#if defined key_dynspg_flt
23   USE solver
24#endif
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC                  &
30      & sol_oce_alloc_tam,   &
31      & sol_oce_dealloc_tam, &
32      & sol_oce_tam_init
33
34   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   gcx_tl, gcx_ad   !: TA of now solution of the elliptic eq.
35   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   gcxb_tl, gcxb_ad !: TA of before solution of the elliptic eq.
36   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   gcb_tl, gcb_ad   !: TA of second member of the elliptic eq.
37   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   gcr_tl           !: Tangent of residu =b-a.x
38   INTEGER,  PUBLIC, DIMENSION(:), SAVE, ALLOCATABLE :: nitsor          ! Number of SOR iterations
39   LOGICAL, PRIVATE, SAVE :: ll_alloctl = .FALSE., ll_allocad = .FALSE.
40
41   INTEGER, PARAMETER,  PUBLIC :: &
42#if defined key_orca_r2  ||   defined key_seabass  ||   defined key_gyre
43      & jp_it0adj = 600  ! number of solver iterations (tl and adj)
44#else
45      & jp_it0adj = 1000 ! number of solver iterations (tl and adj)
46#endif
47
48   !!----------------------------------------------------------------------
49   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
50   !! $Id$
51   !! Software governed by the CeCILL licence    (NEMOGCM/NEMO_CeCILL.txt)
52   !!----------------------------------------------------------------------
53CONTAINS
54   INTEGER FUNCTION sol_oce_alloc_tam( kmode )
55      !!----------------------------------------------------------------------
56      !!                ***  FUNCTION sol_oce_alloc  ***
57      !!----------------------------------------------------------------------
58      INTEGER, OPTIONAL :: kmode
59      INTEGER  :: ierr(3)
60      INTEGER :: imode
61      !!----------------------------------------------------------------------
62      IF ( PRESENT(kmode) ) THEN
63         imode = kmode
64      ELSE
65         imode = 0
66      END IF
67      ierr(:) = 0
68      !
69      IF ( .NOT. ALLOCATED(nitsor) ) THEN
70      ALLOCATE( nitsor(nitend - nit000 + 1) , STAT=ierr(1) )
71      nitsor(:) = jp_it0adj
72      END IF
73      IF ( ( imode == 0 ) .OR. ( imode == 1 ) .AND. ( .NOT. ll_alloctl ) ) THEN
74      ALLOCATE( gcx_tl (1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)   ,     &
75         &      gcxb_tl(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)   ,     &
76         &      gcb_tl (1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)   ,     &
77         &      gcr_tl (1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)   , STAT=ierr(2) )
78         ll_alloctl = .TRUE.
79      END IF
80      IF ( ( imode == 0 ) .OR. ( imode == 2 ) .AND. ( .NOT. ll_allocad ) ) THEN
81      ALLOCATE( gcx_ad (1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)   ,     &
82         &      gcxb_ad(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)   ,     &
83         &      gcb_ad (1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj)   , STAT=ierr(3) )
84         ll_allocad = .TRUE.
85      END IF
86         !
87      sol_oce_alloc_tam = MAXVAL(ierr)
88      !
89      IF( lk_mpp            )   CALL mpp_sum ( sol_oce_alloc_tam )
90      IF( sol_oce_alloc_tam > 0 )   CALL ctl_warn('sol_oce_alloc_tam: allocation of arrays failed')
91      !
92   END FUNCTION sol_oce_alloc_tam
93   !
94   INTEGER FUNCTION sol_oce_dealloc_tam( kmode )
95      !!----------------------------------------------------------------------
96      !!                ***  FUNCTION sol_oce_dealloc  ***
97      !!----------------------------------------------------------------------
98      INTEGER, OPTIONAL :: kmode
99      INTEGER  :: ierr(3)
100      INTEGER :: imode
101      !!----------------------------------------------------------------------
102      IF ( PRESENT(kmode) ) THEN
103         imode = kmode
104      ELSE
105         imode = 0
106      END IF
107
108      ierr(:) = 0
109      !
110
111      IF ( ( imode == 0 ) .OR. ( imode == 1 ) .AND. ( ll_alloctl ) ) THEN
112         DEALLOCATE( gcx_tl ,     &
113              &      gcxb_tl,     &
114              &      gcb_tl ,     &
115              &      gcr_tl , STAT=ierr(2) )
116         ll_alloctl = .FALSE.
117      END IF
118      IF ( ( imode == 0 ) .OR. ( imode == 2 ) .AND. ( ll_allocad ) ) THEN
119         DEALLOCATE( gcx_ad  ,     &
120            &        gcxb_ad ,     &
121            &        gcb_ad  , STAT=ierr(3) )
122         ll_allocad = .FALSE.
123      END IF
124         !
125      sol_oce_dealloc_tam = MAXVAL(ierr)
126      !
127      IF( lk_mpp                  )   CALL mpp_sum ( sol_oce_dealloc_tam )
128      IF( sol_oce_dealloc_tam > 0 )   CALL ctl_warn('sol_oce_dealloc_tam: allocation of arrays failed')
129      !
130   END FUNCTION sol_oce_dealloc_tam
131   !
132   SUBROUTINE sol_oce_tam_init( kmode )
133      !!-----------------------------------------------------------------------
134      !!
135      !!                  ***  ROUTINE sol_oce_tam_init  ***
136      !!
137      !! ** Purpose : Allocate and initialize the tangent linear and
138      !!              adjoint arrays
139      !!
140      !! ** Method  : kindic = 0  allocate/initialize both tl and ad variables
141      !!              kindic = 1  allocate/initialize only tl variables
142      !!              kindic = 2  allocate/initialize only ad variables
143      !!
144      !! ** Action  :
145      !!
146      !! References :
147      !!
148      !! History :
149      !!        ! 2009-03 (A. Weaver) Initial version (based on oce_tam_init)
150      !!        ! 2010-04 (A. Vidard) Nemo3.2 update
151      !!        ! 2012-09 (A. Vidard) Nemo3.4 update
152      !!-----------------------------------------------------------------------
153      !! * Arguments
154      INTEGER, INTENT(IN) :: kmode
155      INTEGER :: ierr
156      IF ( ( kmode == 0 ) .OR. ( kmode == 1 ) ) THEN
157         IF ( .NOT. ll_alloctl ) ierr = sol_oce_alloc_tam ( 1 )
158         gcx_tl (:,:) = 0.0_wp
159         gcxb_tl(:,:) = 0.0_wp
160         gcb_tl (:,:) = 0.0_wp
161         gcr_tl (:,:) = 0.0_wp
162      END IF
163      IF ( ( kmode == 0 ) .OR. ( kmode == 2 ) ) THEN
164         IF ( .NOT. ll_allocad ) ierr = sol_oce_alloc_tam ( 2 )
165         gcx_ad (:,:) = 0.0_wp
166         gcxb_ad(:,:) = 0.0_wp
167         gcb_ad (:,:) = 0.0_wp
168      END IF
169   END SUBROUTINE sol_oce_tam_init
170   !!======================================================================
171
172END MODULE sol_oce_tam
Note: See TracBrowser for help on using the repository browser.