source: CPL/oasis3/trunk/src/lib/fscint/src/memoir.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: 4.8 KB
RevLine 
[1677]1      MODULE memoir
2C****
3C               *****************************
4C               * OASIS ROUTINE  -  LEVEL 3 *
5C               * -------------     ------- *
6C               *****************************
7C
8C**** *memoir*  - F90 interface for dynamic allocation in FSCINT
9C
10C     Purpose:
11C     -------
12C     Handle dynamic allocation in FSCINT
13C
14C**   Interface:
15C     ---------
16C       *CALL*  *memoir(r-i)(pw,koff,ksize,koldsize)
17C
18C     Input:
19C     -----
20C                pw       : array to be allocated
21C                ksize    : new size to be allocated
22C                koldsize : old size of allocation
23C
24C     Output:
25C     ------
26C                koff     : status flag
27C
28C     Workspace:
29C     ---------
30C     None
31C
32C     Externals:
33C     ---------
34C     None
35C
36C     Reference:
37C     ---------
38C     This F90 module handles dynamic allocation within FSCINT.
39C     It deals with both INTEGER and REAL memory allocation.
40C     It has been tested on a variety of platforms (SGI, VPP, T3E, C90)
41C     and is truly portable. The compilation step may vary across
42C     platforms (see OASIS documentation 2.2). The module has been
43C     written with fixed format and should then be named with suffix .f
44C
45C     History:
46C     -------
47C       Version   Programmer     Date      Description
48C       -------   ----------     ----      ----------- 
49C       2.2       A. Piacentini  97/09/15  Created
50C       2.3       A. Piacentini  98/10/01  Modified: Bug corrected in case
51C                                          of reallocation
52C
53C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54C* ------------------------------------------------------------------
55C
56C* ---------------------------- Poema verses ----------------------------
57C
58C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59C
60C* Block interface
61C
62          INTERFACE memoirh
63             MODULE PROCEDURE memoirr,memoiri
64          END INTERFACE
65C
66      CONTAINS
67C
68C* Real allocation
69C
70      SUBROUTINE memoirr(pw,koff,ksize,koldsize)
71C
72      USE mod_kinds_oasis
73      REAL(kind=ip_realwp_p), DIMENSION(:), POINTER  :: pw
74      INTEGER (kind=ip_intwp_p)                      :: koff
75      INTEGER (kind=ip_intwp_p)                      :: ksize
76      INTEGER (kind=ip_intwp_p)                      :: koldsize
77C
78      REAL(kind=ip_realwp_p), DIMENSION(:), POINTER  :: aw
79      INTEGER (kind=ip_intwp_p)                      :: ierr
80C
81C      PRINT *,'memoirR ksize ',ksize
82C
83      IF (ksize > 0) THEN
84          IF (koldsize > 0) THEN
85              allocate(aw(ksize),stat=ierr)
86C              PRINT *,'ierr= ',ierr
87              IF(.NOT. associated(aw)) PRINT *,'memoirR Something Wrong'
88              koff=1
89              aw(1:koldsize)=pw
90              deallocate(pw,stat=ierr)
91C              PRINT *,'memoirR dealloc of old pw ierr= ',ierr
92              pw=>aw
93          ELSE   
94              allocate(pw(ksize),stat=ierr)
95C              PRINT *,'ierr= ',ierr
96              IF(.NOT. associated(pw)) PRINT *,'memoirR Something Wrong'
97C
98C             PRINT *,'memoirR allocated'
99C
100              koff=1
101          ENDIF
102      ELSE
103          IF(associated(pw)) THEN
104              deallocate(pw,stat=ierr)
105C              PRINT *,'memoirR dealloc ierr= ',ierr
106          ELSE
107              STOP 'error in memoirR deallocation'
108          END IF
109C
110C          PRINT *,'memoirR deallocated'
111C
112      ENDIF
113C
114      END SUBROUTINE memoirr
115C
116C* Integer allocation 
117C
118      SUBROUTINE memoiri(kw,koff,ksize,koldsize)
119C
120      USE mod_kinds_oasis
121      INTEGER (kind=ip_intwp_p) , DIMENSION(:), POINTER  :: kw
122      INTEGER (kind=ip_intwp_p)                      :: koff
123      INTEGER (kind=ip_intwp_p)                      :: ksize
124      INTEGER (kind=ip_intwp_p)                      :: koldsize
125C
126      INTEGER (kind=ip_intwp_p) , DIMENSION(:), POINTER  :: iw
127      INTEGER (kind=ip_intwp_p)                      :: ierr
128C
129C      PRINT *,'memoirI ksize ',ksize
130C
131      IF (ksize > 0) THEN
132          IF (koldsize > 0) THEN
133              allocate(iw(ksize),stat=ierr)
134C              PRINT *,'ierr= ',ierr
135              IF(.NOT. associated(iw)) PRINT *,'memoirI Something Wrong'
136              koff=1
137              iw(1:koldsize)=kw
138              deallocate(kw,stat=ierr)
139C              PRINT *,'memoirI dealloc of old kw ierr= ',ierr
140              kw=>iw
141          ELSE   
142              allocate(kw(ksize),stat=ierr)
143C              PRINT *,'ierr= ',ierr
144              IF(.NOT. associated(kw)) PRINT *,'memoirI Something Wrong'
145C
146C             PRINT *,'memoirI allocated'
147C
148              koff=1
149          ENDIF
150      ELSE
151          IF(associated(kw)) THEN
152              deallocate(kw,stat=ierr)
153C              PRINT *,'memoirI dealloc ierr= ',ierr
154          ELSE
155              STOP 'error in memoirI deallocation'
156          END IF
157C
158C          PRINT *,'memoirI deallocated'
159C
160      ENDIF
161C
162      END SUBROUTINE memoiri
163C
164      END MODULE memoir
165
166
167
168
Note: See TracBrowser for help on using the repository browser.